hashmap1.7和1.8的区别

Z, ZLW 1816

hashmap1.7和1.8的区别:1、底层数据结构不同;2、resize()方法不同;3、对null键的区分不同;4、遍历不同;5、新增节点方法不同;6、rehash时链表分散不同;7、rehash不同;8、扩容机制不同。其中,底层数据结构不同指hashmap1.7是数组+链表,hashmap1.8则是数组+链表+红黑树结构。

1、底层数据结构不同

hashmap1.7:数组+链表。

hashmap1.8:数组+链表+红黑树结构(当链表长度大于8,转为红黑树)。

2、resize()方法不同

hashmap1.7:JDK1.7中resize()方法负责扩容,inflateTable()负责创建表。

hashmap1.8:JDK1.8中resize()方法在表为空时,创建表;在表不为空时,扩容。

3、对null键的区分不同

hashmap1.7:1.7版本中对于键为null的情况调用putForNullKey()方法。

hashmap1.8:1.8中没有区分键为null的情况,但是两个版本中如果键为null,那么调用hash()方法得到的都将是0,所以键为null的元素都始终位于哈希表table[0]中。

4、遍历不同

hashmap1.7:1.7在遍历的同时没有添加数据,而是另外调用了addEntry()方法,将节点添加到链表头部。

hashmap1.8:当1.8中的元素处于链表的情况,遍历的同时最后如果没有匹配的,直接将节点添加到链表尾部。

5、新增节点方法不同

hashmap1.7:1.7中新增节点采用头插法。

hashmap1.8:1.8中新增节点采用尾插法,这也是为什么1.8不容易出现环型链表的原因。

6、rehash时链表分散不同

hashmap1.7:1.7中是通过更改hashSeed值修改节点的hash值从而达到rehash时的链表分散。

hashmap1.8:1.8中键的hash值不会改变,rehash时根据(hash&oldCap)==0将链表分散。

7、rehash不同

hashmap1.7:1.7中rehash时有可能改变链表的顺序(头插法导致)。

hashmap1.8:1.8 rehash时保证原链表的顺序。

8、扩容机制不同

hashmap1.7:jdk1.7时扩容时会执行transfer()方法,创建一个新的Entry空数组,长度是原数组的2倍,遍历原Entry数组,重新reHash到新的数组中,因为长度改变,Hsah的规则也会改变。使用头插法,从头部插入数据。触发了扩容后 1.7 是先扩容后插入新值的。

hashmap1.8:1.8 先插值再扩容,jdk1.8时扩容时会执行reSize()方法,创建的不是Entry数组,而是一个Node节点数组,会使用尾插法,插入数据。

回复

我来回复
  • 暂无回复内容

注册PingCode 在线客服
站长微信
站长微信
电话联系

400-800-1024

工作日9:30-21:00在线

分享本页
返回顶部