【问题标题】:Exact cause of hash code collisions in HashMapHashMap中哈希码冲突的确切原因
【发布时间】:2016-12-16 09:38:26
【问题描述】:

我知道哈希图的工作原理以及它们如何解决冲突。但是许多与 SO 上的冲突相关的答案都指向两个原因:

  • HashCode 契约 - 不相等的对象可以有相同的哈希码
  • 基础数组大小 - 大小是固定的,因此当桶位置已满时可以重复使用(使用模运算符)。

我的假设是上面的原因 2 也是正确的,我确信原因 1。

只有 1 个问题:

  • Javadoc 说哈希图使用 LF 和容量来决定何时重新哈希。我将其理解为部分调整底层数组的大小。那么上面的原因2怎么可能呢????

NB: This question 最接近我想了解的内容。然而,接受的答案似乎完全放弃了原因 2,所以它仍然让我想知道。

【问题讨论】:

  • Hashmap 根据容量调整大小(当 LF * 容量
  • @LaurentB 这不是真的。如果检测到冲突,则不会调整大小。
  • @Kayaman 抱歉,只有在存储桶已满且达到容量时才重新读取源代码 (1.7)
  • @LaurentB 我的问题是底层数组的大小如何导致冲突?
  • 嗯,一个更小的数组显然有更高的碰撞机会。如果你随机决定是把 2 个球扔进 2 个桶还是 10 个桶,哪个更有可能最终在同一个桶里有 2 个球?你确定你知道哈希图是如何工作的吗?

标签: java hash hashmap hashtable


【解决方案1】:

你的理由 2 有缺陷。如果添加两个(不相等的)对象最终在同一个桶中(hashcode % buckets.length),即使有很多空桶,也可以重用一个桶。这里没有“getting full”元素,只是当桶被填满时,显然更有可能最终进入非空桶。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-13
    • 1970-01-01
    • 2016-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多