HashMap原理图
2021-08-08 11:51:56 0 举报
介绍hashMap原理
作者其他创作
大纲/内容
否
直接插入
转化成红黑树:treeifyBin()
1.初始化新数组,然后判断旧数组是否为空,不为空需要需要迁移;否则就返回新数组即可。
是
判断新数组的阈值newThr==0?
旧数组长度>最大值oldCap >= MAXIMUM_CAPACITY
旧数组足够大,就不用扩容了。
newCap = oldCap << 1&&oldCap >= 16
插入节点到p.next
return oldTab;
循环获取 e = oldTab[j] != null
红黑树插入key和value
旧数组阈值oldThr > 0
直接循环结束;
key是否存在
return newTab;
扩容原理resize()
新数组的容量和阈值扩容为旧数组的两倍:newCap = oldCap << 1
1.这个for循环链表,就是为了插入或覆盖;在插入的时候判断是否需要扩容;
结束
遍历链表,迁移到新数组中。
(2)这块内容介绍初始化信息
判断节点e是否为TreeNode节点?
key==e.key?
扩容resize()
问题:1.为何旧数组长度和阈值与0大小关系存在不一致呢?
获取e.next,判断是否为null?
2.传递容器大小:new HashMap(int i);
++size > threshold当put后之值是否大于阈值
p instanceof TreeNode ?判断是否为红黑树?
tab==null或tab.length==0?
binCount >= TREEIFY_THRESHOLD - 1
结束扩容
1.默认负载因子loadfactor:0.75f; 2.默认的阈值thrshold:0.75f x 16=12; 3.默认的容器大小为16; 4.容器的容量始终是2的幂;
(3)这块内容介绍扩容信息
直接覆盖value
1.无参构造函数:new HashMap();
HashMap初始化方式
旧数组长度>0
新数组容量=旧数组阈值;newCap = oldThr;
初始化阈值newThr=0.75 x newCap
将这个Node节点e放到新数组中;newTab[e.hash & (newCap - 1)] = e
新数组容量为默认值16;阈值为:0.75f x 16 = 12
循环旧数组for (int j = 0; j < oldCap; ++j)
遍历链表,插入;这里是for循环。
判断旧数组oldTab != null
(1)这块内容介绍添加元素信息
HashMap添加元素
再次循环,获取下一个Node节点
p==null?
(e = p.next) == null
收藏
收藏
0 条评论
回复 删除
下一页