JDK源码分析-HashMap
2021-09-12 23:27:23 0 举报
详细分析jdk8中HashMap的put、remove实现机制以及resize实现
作者其他创作
大纲/内容
oldCap >= 1 << 30
oldCap > 0
TreeNode节点
结束
当前节点是TreeNode
取得newCap、threshold值
return newTab
是
return oldTab
e instanceof TreeNode
将原链表拆分为两个链表
removeNode开始
threshold = Integer.MAX_VALUE
Map中是否有数据
key是否在Map中验证
resize扩容
遍历table,循环检测每一个元素
节点类型判断
p.next = node.next
newTab[e.hash & (newCap - 1)] = e
新值与原值相同引用||equals
resize开始
否
(e = oldTab[j]) != null
oldThr > 0
链表长度是否大于8
覆盖原值
当前节点为链表
e.next == null
putVal开始
newThr = oldThr << 1
newCap = 16;newThr = (int)(0.75 * 16);
e.hash & oldCap == 0详解https://blog.csdn.net/u010425839/article/details/106620440链表拆分与treeNode拆分同理
resize初始化
++size > threshold
tab[index] = node.next
(newCap = oldCap << 1) < 1 << 30 &&oldCap >= 16
(p = tab[i = (n - 1) & hash]) == null
附:HashMap 1.7和1.8的区别:https://blog.csdn.net/weixin_44141495/article/details/108402128
table是否为空
当前值与原始值比较
table数组长度是否大于64
e.hash & oldCap
HashMap源码中put、remove执行流程详解、resize流程详解
size指的是Map中Entry数量threshold=(int)newCap*loadFactor
完全一致
有值
newCap = threshold
链表遍历
当前Key与Map中key比较
e = e.next
转红黑树
收藏
收藏
0 条评论
下一页