【问题标题】:When HashMap will use TreeSet as a bucket? [duplicate]HashMap 什么时候会使用 TreeSet 作为存储桶? [复制]
【发布时间】:2019-05-07 09:30:46
【问题描述】:

HashMap 文档我们可以阅读:

请注意,使用具有相同 hashCode() 的多个键是降低任何哈希表性能的可靠方法。为了改善影响,当键是 Comparable 时,此类可能会使用键之间的比较顺序来帮助打破平局。

我知道如果key实现了Comparable接口,在多次hash冲突时,bucket可以从List转换为TreeSet

是否可以设置容量,或检查何时转换?

【问题讨论】:

  • 你从哪里得到TreeSet?而且你在一个句子中说了很多事情是错误的
  • 来自HashMap 的实现说明 -> 不是真正的TreeSet,而是TreeNodes,其行为类似于我们的TreeSet
  • TreeNodeTreeSet无关

标签: java java-8


【解决方案1】:

在 openjdk 中,当存储桶大于 static final int TREEIFY_THRESHOLD = 8 时,它会这样做

使用树而不是列表的 bin 计数阈值。将元素添加到至少具有这么多节点的 bin 时,bin 将转换为树。该值必须大于 2 并且至少应为 8,以便与树移除中关于在收缩时转换回普通 bin 的假设相吻合。

另外你必须超过static final int MIN_TREEIFY_CAPACITY = 64

可对其进行树化的 bin 的最小表容量。 (否则,如果 bin 中有太多节点,则会调整表的大小。) 应至少为 4 * TREEIFY_THRESHOLD 以避免调整大小和树化阈值之间的冲突。

来源:http://hg.openjdk.java.net/jdk8/jdk8/jdk/file/687fd7c7986d/src/share/classes/java/util/HashMap.java

对于其他实现可能会有所不同。你不能修改它(不使用反射)。

而且它不是树集而是red-black tree

【讨论】:

  • 错误 - 阅读我的答案中的链接
  • 感谢您的澄清。
【解决方案2】:

不是List,而是LinkedList

不是TreeSet,而是完美平衡的红黑树

它没有Comparable,但是实现了

这并不取决于您是否正在实施Comparable - bucked 仍然会从 LinkedList 转换为红黑树。 Comparable 只是更容易确定一个条目是红色还是黑色,即向左还是向右移动。

当移动到一棵树时,会根据总体存在多少条目以及该特定存储桶中存在多少条目来做出决定。

如果您真的想阅读更多内容In my other answer

对于HashMap 而言,选择正确的容量并非易事,要阅读更多内容here

【讨论】:

  • 在您的 cmets 中还有更多内容需要阅读。 :)
  • 感谢您的澄清。我也标记为重复
猜你喜欢
  • 1970-01-01
  • 2021-12-25
  • 2019-10-20
  • 2010-09-11
  • 1970-01-01
  • 1970-01-01
  • 2014-04-29
  • 1970-01-01
  • 2011-09-12
相关资源
最近更新 更多