解答
DK7是数组+链表,JDK8 是数组+链表/红黑树。
1、链表插入方式的不同
在1.7之前,链表元素的插入采用的是头插法,也就是说,当有新结点进来时,会在插入在链表的头部。很明显,由于不用遍历链表,这种插入方式的效率是更高的。但是1.8之后,因为当结点插入的时候,本身就要为了判断元素的个数而遍历链表(看看是否达到了树化的阈值),所以就可以搭一个顺风车,在遍历完之后,把结点插入到链表尾部,即采用的尾插法。这种方式也解决了多线程下可能引发的死锁问题。因为头插法的链表在扩容移动时,会被逆序,即后插入的先被处理,如果这个时候有另一线程进行get操作,就有可能引发死锁
2、插入时机不同
1.7之前是扩容后再插入新的数据,并且不会先计算插入值的哈希值,最后单独算。
1.8之后是先插入再扩容,插入的值和大家一起计算新的哈希值。
好文,喜欢看,比书上的好