java - 我在使用 JDK1.8 的 HashMap 时遇到了一些问题

标签 java hashmap resize

这是部分代码。 当节点长度超过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/

相关文章:

android - 如何缩放/调整文本以适合 TextView?

java - 真正的随机性在什么时候丢失了?真正的随机数作为 java.util.Random 种子?

java - 使用 Spring 4 PropertySource 时找不到可重复

java - 通过 CTPageSz 的 POI XWPF 页面大小已关闭

android - 使用 HashMap 填充 Spinner?

css - 谷歌地图 Canvas 在点击时动态调整大小

javascript - 使用 firebase 存储上传后如何获取调整大小的 downloadUrl(Web SDK + Resize images extension)

java - Maven JIB 在arm32v7/adoptopenjdk docker 容器内返回 "CertPathValidatorException: signature check failed"

java - 为什么clear hashmap方法会清除数组列表中添加的映射

java - 将 HashMap 值传递给 url