史上最全面的HashMap详解,HashMap实现原理与基础知识点介绍
创作时间:
作者:
@小白创作中心
史上最全面的HashMap详解,HashMap实现原理与基础知识点介绍
引用
CSDN
1.
https://blog.csdn.net/i_YOLO/article/details/145643361
1.HashMap实现原理
(1)JDK1.7以前
在JDK1.7版本之前,HashMap底层数据结构采用的是
数组+链表
的形式
当向HashMap中添加数据时,会采用哈希算法,将元素的key映射到底层数组对应的位置,我们称之为槽位(Bucket)
众所周知,
哈希算法对于不同key的计算结果可能相同
,所以当不同的key映射到数组上的同一个槽位时,它们就会以链表的形式存储到同一个槽位上
由于链表的查询速度时O(n),所以冲突很严重,当一个索引上的链表非常长时,查询效率就会很低
(2)JDK1.7以后
所以在JDK1.8版本的时候做了优化,HashMap采用
数组+链表和数组+红黑树
两种方法相结合的方式存储数据
当链表长度达到规定的阈值(默认为8)时,会将链表转化为红黑树存储,提高查询效率,时间复杂度降低到O(logn)
同时,在数量小于6时,会将红黑树转化为链表
2.HashMap的
put(key,value)
方法(JDK1.8版本)
- HashMap采用put(key,val)方法存储对象,调用hashCode()方法计算哈希值,获取对应bucket的位置
- 如果该bucket上没有存放元素,则直接插入
- 如果该bucket上存放着元素,则
比较key值 - 如果key值相同,则直接覆盖value
- 如果key值不同,则需要遍历链表或者红黑树来查询是否有相同的key
- 查询到相同的key,则覆盖value
- 查询不到相同的key,对于链表采取尾插法插入数据,对于红黑树则插入到树的末尾
- 存放数据完毕后,检查链表长度是否超过阈值(默认为8)
- 如果链表长度超过阈值,同时
HashMap底层数组的长度超过64
,则将链表转化为红黑树,以提高查询效率
- 检查负载因子是否超过阈值(默认为0.75)
- 如果超过阈值,则进行
扩容
操作(负载因子概念和扩容机制详细看第3大点)
- 需要扩容的话完成扩容操作,数据添加到此结束
3.HashMap的扩容机制
(1)负载因子
负载因子是衡量哈希表使用情况的重要指标,定义如下:
负载因子 = 数组中存储的元素个数 / 数组大小
负载因子太低会导致大量的空桶浪费空间,负载因子太高会导致大量的碰撞,降低性能
0.75的负载因子在这两个因素之间取得了良好的平衡。
(2)扩容机制
HashMap默认的负载因子为0.75,即如果HashMap中的元素个数超过了总容量的75%,则会触发扩容机制:
- 将哈希表(底层数组)扩大到原来的两倍,创建一个新的数组
- 将旧数组中的数据移到新数组中
4.HashMap在多线程下存在的问题
JDK1.7中的HashMap使用头插法插入元素,在多线程的环境下,扩容的时候有可能导致
环形链表
的出
现,形成死循环。因此,JDK1.8使用尾插法插入元素,在扩容时会保持链表元素原本的顺序,不会出现
环形链表的问题。
多线程同时执行put操作
,如果计算出来的索引位置是相同的,那会造成前一个key被后一个key覆
盖,从而导致元素的丢失。此问题在DK1.7和DK1.8中都存在。
热门推荐
偶然所得如何缴纳个人所得税:法律规定与实务操作
潜行的三种风格:潜行元素在游戏设计中的演变历程
江苏兴化:擦亮金字招牌,历史文化名城焕发新时代活力
单位代缴五险是否合法?全面解析社保缴纳的法律问题
斯金纳的操作条件反射理论介绍
承诺函的公章:确保承诺的有效性和法律效力
古代华夏历史中的隐藏科技,领先其它国家数百年?
连续用眼几小时,视疲劳怎么办?专家建议这样做....
借款起诉要哪些证据资料?一文详解借款纠纷诉讼要点
女子咸鱼卖车案件背后的真相:继承法与婚姻家庭法律问题解析
摩羯刚过,华南地区气候都乱了!极端降雨来袭,12个省份或要遭殃
展会专业观众定位分析的“三个什么”
海女:即将消亡的传奇
骨骺闭合怎么判断?正常的骨骺闭合时间表
再见NBA!才30岁的哈雷尔,为何会无球可打?
《道德经》第六十五章:以智治国,国之贼;不以智治国,国之福
练习唱歌:从入门到专家的完整指南
不锈钢酸洗钝化液化学成分配方还原及应用解析
苯甲酸钠:一种常见的食品防腐剂
预算十万,如何挑选一辆性价比高的车?一篇文章带你了解市场热门选择
修仙兵器等级划分:打造属于自己的神器
王安石变法中的均输法解析
孕妇应该如何合理安排日常饮食?
甘油三酯低应吃什么食物
中国人适合散心的4个古镇, 个个美如画,你去过几个?
跌停涨停的封停情况如何判断?这种判断对投资策略有哪些影响?
马林诺夫斯基 | 巫术、科学与宗教
上海最大CBD中央公园:绿谷公园的隐秘之美
老子的“不争之争”,在两千多年后,仍值得今天每个人体悟
什么是WiFi信号放大器?WiFi信号放大器的工作原理、参数、特点、应用和作用