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做了大量的优化,以提升其在各种情况下的性能表现。
本文来源于互联网,如若侵权,请联系管理员删除,本文链接:https://www.9969.net/24108.html