这是部分代码。 当节点长度超过7时,会将Node转为TreeNode,但在函数treeifyBin()中,如果tab长度小于64,则只执行resize()。
// binCount is length of Node, TREEIFY_THRESHOLD is default 8
if (binCount >= TREEIFY_THRESHOLD - 1)
treeifyBin(tab, hash);
// tab is Node[], MIN_TREEIFY_CAPACITY is default 64
if (tab == null || (n = tab.length) < MIN_TREEIFY_CAPACITY)
resize();
我不明白为什么节点长度与 resize() 有关。
最佳答案
正如你所知,java-8 hashmap 的内部工作发生变化,当内部链表达到阈值时,它会转换为树(具体来说是 RB 树)。转换树的逻辑取决于桶中节点的长度,因此它的值在将列表转换为树之前检查是否可以通过调整链表的大小来插入节点,而不是将列表转换为树,这是昂贵的操作。这里还需要考虑一件事,因为频繁从 map 中删除可能会导致树再次转换回列表,因此在您的 treeifybin() 方法中,会检查调整大小,然后您当前的结构将更改为树。
有关更多信息,请检查以下内容: http://hg.openjdk.java.net/jdk8/jdk8/jdk/file/687fd7c7986d/src/share/classes/java/util/HashMap.java
干杯:)
关于java - 我在使用 JDK1.8 的 HashMap 时遇到了一些问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53847430/