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.kdun.com/ask/782180.html
本网站发布或转载的文章及图片均来自网络,其原创性以及文中表达的观点和判断不代表本网站。如有问题,请联系客服处理。
发表回复