1.引入

  • Lambda 表达式
  • 函数式接口
  • 方法引用 / 构造器引用
  • Stream API
  • 接口中的默认方法 / 静态方法
  • 新时间日期 API
  • 其他新特性

2.优化

  • 速度更快(HashMap)
  • 代码更少(Lambda)
  • 强大的 Stream API
  • 便于并行
  • 最大化减少空指针异常(Optional)

3.番外优化

3.1 HashMap

(1)HashMap概述
HashMap 根据键的 hashCode 值存储数据,大多数情况下可以直接定位到它的值,因而具有很快的访问速度,但遍历顺序却是不确定的。 HashMap最多只允许一条记录的键为null,允许多条记录的值为null。HashMap 非线程安全,即任一时刻可以有多个线程同时写 HashMap,可能会导致数据的不一致。如果需要满足线程安全,可以用 Collections 的 synchronizedMap 方法使 HashMap 具有线程安全的能力,或者使用 ConcurrentHashMap。

(2)HashMap三个属性
1. capacity:当前数组容量,始终保持 2^n,可以扩容,扩容后数组大小为当前的 2 倍。
2. loadFactor:负载因子,默认为 0.75。
3. threshold:扩容的阈值,等于 capacity * loadFactor

(3)Java7 HashMap工作原理
数组+链表
使用哈希算法(link),hash出指定下标,将值放到指定下标内,如果存储的下标为已经有值,则进行equal对比,相同则替换,不同则在该位置使用链表进行存储(Java7插入链表节点使用头插法,Java8中变成尾插法),如图1-1

(4)Java8 HashMap工作原理
数组+链表+红黑树
当链表长度大于8,并且总容量大于64的时候,链表存储会变成红黑树(link)的存储方式,除添加操作外,其他操作效率均有提高。

3.2 JVM,方法区变化

方法区变化:
方法区为hotspot虚拟机特有的概念,主要用于加载类信息,核心类库。
方法区为堆空间永久区(PremGen)的一部分,Java8废除了永久区,定义了元空间(MetaSpace)充当方法区,元空间使用主机物理内存,方法区很少进行垃圾回收,只有当方法区快要满时,才会进行垃圾回收,Java8的元空间使用物理内存,等于给方法区进行了扩容。

虚拟机调优参数
废除:PremGenSize/MaxPremGenSize
引入:MetaSpaceSize/MaxMetaSpaceSize