HashMap1.7源码剖析

源于蚂蚁课堂的学习,点击这里查看(老余很给力)

静态内部类 

1.构造方法 

 

 

2.put(K,V) 

 

 

3.get(k) 

4.resize() 

 

 

5.总结

1.HashMap1.7实际上是基于数组+单向链表的数据结构去存储数据的,而且是使用静态内部类Entry去维护键值对
2.如果不指定,HashMap的数组的初始容量为16,负载因子为0.75
3.由于HashMap的put没有加任何锁,所以HashMap非线程安全
4.HashMap允许key为null,默认放在数组第一个链表
5.HashMap出现hashCode冲突时,通过计算hashCode的hash值,再根据hash值的数组长度,计算出数据对应的index,将其放入index
对应的链表中。
6.为了解决index冲突,通过hash值与数组长度-1按位与运算计算下标
7.put时,将非空的key计算其index,根据index找到对应链表,按照链表的顺序从头遍历比较key(==比较基本类型,equals比较对象)
将key重复的覆盖其value,key不存在的,创建新Entry,并建立链接关系,加入链表的首位
8.创建新键值对时,会判断数组是否需要扩容,必须满足两个条件,数组有效长度>=阈值,且当前计算出的index对应数组位置已有值。
第一个判断,是用于判断实际长度是否真的已经超过阈值;第二个判断是用于判断当前插入的数据对应的index是否有数据,
如果没数据,直接放入,不用扩容。所以,数组有效长度并不一定小于阈值,有可能在首次扩容前均匀分布。用于保证数组
每个位置都有数据
9.HashMap扩容时,默认是扩容2倍,会将之前数组中存放的所有链表数据都重新计算一次index下标,效率低
10.负载因子为什么默认为0.75?负载因子越大,产生的index冲突越多,导致查询效率变低,负载因子越小,其空间利用率约低,浪费内存。
故做权衡,使用0.75
原创文章 148 获赞 258 访问量 11万+

猜你喜欢

转载自blog.csdn.net/yxh13521338301/article/details/105535513