HashMap put 解析
2020-12-08 09:21:06 8 举报
hashMap
作者其他创作
大纲/内容
表示当HashMap的size大于threshold时会执行resize操作
桶扩容resize(增加一倍的桶的2次幂)
直接替换掉原来的那个
table数组是否为空
结束
loadFactor 装载因子
遍历比较equals
* 1.可能不同的hash值,经过和【桶】数量取模(位运算)后都是对应同一个位置的2.key对应的hash值如果是同一样的,他们分布的桶位置其实也是一样的
为了避免一个桶下面的链表或者红黑树的数量太多,导致查询或分布不好,所以也需要检测扩容
否
是
直接可以插入,成为该位置(桶)的第一个元素
hash碰撞
threshold= capacit * loadFactor
新分配的桶位置上面是否有数据
equals
hashCode
容量是否够++size > threshold
capacitycapacity 容量,capacity就是指HashMap中桶的数量,默认值为16一般第一次扩容时会扩容到64,
size
获取
扩容
链表插入
装载因子用来衡量HashMap满的程度,loadfactor的默认值为0.75f
链表
桶 = 数组大小
根据key计算hash值得到即将插入的数据索引X(桶的位置)
红黑树插入
无
红黑树
threshold阈值
扩容之后,数组长度变了,在数组的下表跟数组长度有关,得1.先重新计算hash2.在判断新的位置
当前桶所指向位置直接插入
链表长度是否大于8且桶大于64
该位置是否为空即:table[X] == null
此位置上存在一个或多个数据(链表或红黑树)
需要 --> 重新计算key的hash值,对应所分配的桶位置
数组该位置是否为数节点
true
1 有相同的hash可能是hash碰撞
容量是否够++seize > threshold
判断桶插入的位置
entry的数量为链表和树中KV的总和
转换为红黑树插入
遍历该桶下的链表准备插入
比较大小
不管是size++ 桶++ 都要检测是否需要扩容
1.先遍历判断k的hash与该位置存的所有元素的k的hash比较是否有相同的
开始
桶扩容resize(初始 16)
threshold:阈值
0 条评论
下一页