当前位置:首页 > 行业动态 > 正文

Hashmap 1.7与1.8版本有哪些显著差异?

HashMap在1.7和1.8版本之间有一些区别。在1.7版本中,HashMap使用头插法插入元素,可能导致环的产生,而在1.8版本中,改为使用尾插法,避免了环的产生。1.8版本的扩容机制也有所改进,使得链表过长的情况得到改善。

Java中的HashMap是一种基于哈希表的实现,它是Java集合框架中的一部分,随着JDK版本的更新,HashMap在1.7和1.8之间发生了显著变化,以下是HashMap在这两个版本中的主要区别:

存储结构方面的变化

1、JDK 1.7的存储结构

数据结构:数组 + 链表

冲突解决方法:通过拉链法解决哈希冲突

优化情况:无特别优化,单条链表过长时效率降低

2、JDK 1.8的存储结构

数据结构:数组 + 链表 + 红黑树

冲突解决方法:拉链法结合红黑树优化

优化情况:当链表长度过长(默认阈值为8)时,链表转化为红黑树以提高查找效率

初始化方式的区别

1、JDK 1.7的初始化方式

独立函数:使用inflateTable()方法初始化

2、JDK 1.8的初始化方式

集成方法:直接集成到了resize()方法中

hash值计算的不同

1、JDK 1.7的hash值计算

扰动处理:4次位运算 + 5次异或运算

2、JDK 1.8的hash值计算

扰动处理:简化为1次位运算 + 1次异或运算

存放数据规则的差异

1、JDK 1.7的数据存放规则

无冲突时:直接存放在数组中

冲突时:存放在链表中

2、JDK 1.8的数据存放规则

无冲突时:直接存放在数组中

冲突且链表长度小于8时:存放在链表中

冲突且链表长度大于等于8且数组长度大于64时:链表转换为红黑树

插入数据方式的对比

1、JDK 1.7的插入数据方式

方法:头插法

2、JDK 1.8的插入数据方式

方法:尾插法

扩容后存储位置的计算方式

1、JDK 1.7的计算方式

按之前索引的计算方式:hashcode>扰动函数>(h&length1)

2、JDK 1.8的计算方式

按照扩容后的规律计算:扩容后的位置=原位置 or 原位置+旧容量

从存储结构、初始化方式、hash值计算、存放数据规则、插入数据方式以及扩容后存储位置的计算方式等方面,详细对比了JDK1.7和JDK1.8中HashMap的不同之处,可以看出,JDK1.8对HashMap做了大量的优化,以提升其在各种情况下的性能表现。

0