Java8 HashMap产生树后原链表依然存在

Java8 HashMap产生树后原链表依然存在且维持着

源码为证

先看TreeNode依赖

15253776-032c4e39e6bcb1ad.png
TreeNode继承关系
15253776-65b9989b21a5bc2e.png
HashMap中的TreeNode

LinkeHashMap中的Entry

15253776-01fe867efff0ad4c.png
双向链表

HashMap中的Node

15253776-3a153dab853f24ba.png

所以说 就算是 TreeNode,依旧具备链表的能力。同属于树、双向链表、链表 节点。


它不止具备这种可以是这种结构的能力,并且它还真的是这种结构。

继续看源码

HashMap的判断包含value的方法,着重看遍历

15253776-299d9133796df92a.png

看这个源码,并没有针对treeNode做判断,做特殊遍历呀,它不能排除当前hashMap没有树结构吧,这不是链表的遍历方法么?所以我就想,是不是链表还在

继续看

15253776-35813f5f9eda8008.png

追加Node到链表, 就算>8 产生tree 是不是意味着链表还在,并且如果还有冲突继续添加着链表元素。
看这 确实 是 没有 去掉 链表结构的,应该是两种结构都存在着。

看上面的添加树结构节点的代码,如果其中还有往链表追加元素,则证明成立

15253776-66d96b2482eda1b7.png

继续看putTreeVal源码

15253776-ef94e7a934c6c30c.png

事实证明,在冲突长度>8并且map容量>64后,冲突位置,确实维持着两种结构(链表、红黑二叉树)

猜你喜欢

转载自blog.csdn.net/weixin_34014555/article/details/87411095