【问题标题】:Confusion with hashmap in Java?与 Java 中的 hashmap 混淆?
【发布时间】:2014-07-24 09:33:44
【问题描述】:

我已阅读该主题中的所有帖子,但我仍然对以下内容感到困惑:何时可能发生覆盖和碰撞?根据我的阅读,我看到:

  • 只要两个对象的equals()方法相同,它们的哈希码必须相同
  • 当两个对象在equals()方法方面不相同时,我们无法保证hashcode()的id,即它可能相同,也可能不同
  • 当我们使用HashMap.put(key, value) HashMap 通过equal() 方法比较对象。如果这两个键是equal(),那么新的value 将被覆盖
  • 如果两个 kay 具有相同的 hashcode,则会发生冲突并由 Java 处理
  • 然而如果两个key相等,那么新的值会被覆盖,但是这也意味着hashCode()必须相同,所以一定会发生碰撞,这和之前的矛盾吗?

有人可以帮我解释一下这些步骤吗?

【问题讨论】:

  • 你写的是正确的。这可能是一个解释问题:当两个对象相等(因此具有相同的哈希码)时,它并不是真正的“必须处理的冲突”。对象是相等的,所以没有需要增加的存储桶大小......

标签: java hashmap hashtable


【解决方案1】:

将哈希图视为一组鸽子洞。每个鸽子洞可以包含多个对象。

hashCode() 返回用于选择包含或将包含该对象的鸽子洞。

equals() 用作识别特定对象(例如用于替换)的标准。

hashCode() 的目的是将典型对象均匀地分散在鸽子洞中。一旦一个特定的鸽洞被识别为可能包含一个物体,那么必须检查该特定组中的所有物体。该操作代价高昂,因为需要调用 equals()

【讨论】:

    【解决方案2】:

    您的第 3 点来得太早了:HashMap hashCode 相同时比较相等。

    HashMap 首先检查哈希码以确定对象在存储桶中的位置。常规的HashMap 仅将具有相同哈希码(以某个数为模)的项目保留在同一个桶中,并且仅检查同一桶中的对象的相等性。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-10-31
      • 1970-01-01
      • 2016-07-18
      • 1970-01-01
      • 2014-07-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多