【问题标题】:Java two Set objects - hashCode() are the same but .equals() failsJava 两个 Set 对象 - hashCode() 相同但 .equals() 失败
【发布时间】:2016-03-06 11:09:17
【问题描述】:

我有两组 (LinkedHashSet) 自定义对象,它们覆盖了 hashCode() 和 equals() 方法。

比较这两个集合时,即使哈希码相同,equal() 方法也会失败。

    System.out.println("cmContacts.equals(cm2Contacts):" + cmContacts.equals(cm2Contacts));
    System.out.println("cm2Contacts.equals(cmContacts):" + cm2Contacts.equals(cmContacts));
    System.out.println("compare hash codes:" + ( cm2Contacts.hashCode() == cmContacts.hashCode() ) );        

这会返回:

cmContacts.equals(cm2Contacts):false

cm2Contacts.equals(cmContacts):false

比较哈希码:真

根据文档,如果哈希码相同,equals 方法应该返回 true。

集合的哈希码定义为集合中元素的哈希码之和,其中空元素的哈希码定义为零。这确保了 s1.equals(s2) 意味着任何两个集合 s1 和 s2 的 s1.hashCode()==s2.hashCode(),这是 Object.hashCode() 的一般合同所要求的。

https://docs.oracle.com/javase/7/docs/api/java/util/Set.html#equals(java.lang.Object)

任何想法为什么会发生这种情况?

【问题讨论】:

  • equals() 不依赖 hashCode()。由实施者来确保一致的行为。 AKA 您的自定义对象有问题。
  • a implies b 不代表b implies a
  • 由于散列冲突,不相等的对象很可能具有相同的散列码。
  • 您引用的文档与您声称的完全相反。
  • 我现在明白了,覆盖的 equals 方法有一个错误。我会尽快接受答案

标签: java hash set linkedhashset


【解决方案1】:

你反过来说:如果两个对象相等,它们必须具有相同的哈希码。具有相同的哈希码并不意味着对象应该相等。

【讨论】:

    【解决方案2】:

    相同的hashcode() 不代表equals

    您可以将其与邮政编码进行比较。你和你的邻居有相同但又不同。

    【讨论】:

      猜你喜欢
      • 2023-03-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-02
      • 2021-03-05
      • 2013-10-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多