HashMap1.8与1.7的区别

HashMap1.8与1.7的区别

组成差别
1.7:数组+单链表
1.8:数据+单链表+红黑树(选它的原因:修改/插入/查询 综合效率高)
链表存放差别:
出现哈希冲突时:
1.7直接把数据存放在链表,再无其它操作
1.8把数据存放在链表,链表长度超过8就转红黑树
扩容差别:
1.7扩容条件是数组大于阈值且存在哈希冲突时扩容
1.8扩容条件是数组长度大于阈值或链表转红黑树时且数组元素小于64时扩容
插值方法:
1.7用的是头插法,(在链表头部插入新值),弊端:可能造成逆序死循环
1.8用的是尾插法可避免上面的问题

为什么HashMap初始容量为什么是2的n次幂及扩容为什么是2倍的形式?
1.首先说2的n次的用意:主要是为了在新的元素进来时减少hash碰撞,通俗的说就是避免新元素多次重复落到一个数组点位上。
举例说明原因:落点算法=(n - 1) & hash
如果不是2的N次:
HashMap1.8与1.7的区别
2的N次16:
HashMap1.8与1.7的区别
以上案例说明2的N次可以明显减少hash碰撞,有效避免重复落点。初始值为16为保证2的N所以是2倍。
多说一句有人问为什么初始值为16,小于16的N次就是4,8再加上考虑到加载因子0.75的话,这样扩容太频。

1.8精要源码注解:HashMap1.8与1.7的区别
HashMap1.8与1.7的区别