Java两个Set对象 - hashCode()是相同的但.equals()失败

Dav*_*idA -2 java hash set linkedhashset

我有两个自定义对象集(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() ) );        
Run Code Online (Sandbox Code Playgroud)

返回:

cmContacts.equals(cm2Contacts):假

cm2Contacts.equals(cmContacts):假

比较哈希码:true

根据文档,如果哈希码相同,则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)

任何想法为什么会这样?

Jon*_*oni 5

你已经倒退了:如果两个对象相等,它们必须具有相同的哈希码.具有相同的哈希码并不意味着对象应该相等.