2016-03-06 63 views
-2

我有两个集合(LinkedHashSet)的自定义对象覆盖hashCode()和equals()方法。Java的两个Set对象 - 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):假

cm2Contacts.equals(cmContacts):假

比较哈希代码:真

按照如果哈希代码相同,那么equals方法应该返回true。

集合的哈希码被定义为集合中元素的哈希码的总和,其中null元素的哈希码被定义为零。这确保对于任何两个集合s1和s2,s1.equals(s2)意味着s1.hashCode()== s2.hashCode(),正如Object.hashCode()的通用契约所要求的那样。

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

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

+0

equals()不取决于* on hashCode()。实施者需要确保一致的行为。 AKA你的自定义对象有问题。 –

+0

“a暗示b”并不意味着“b暗示a”。 –

+0

由于哈希冲突,不相等的对象可能具有相同的哈希码。 –

回答

5

你已经得到它:如果两个对象相等,它们必须具有相同的散列码。拥有相同的哈希码并不意味着对象应该是平等的。

1

相同hashcode()并不意味着equals

您可以将其与ZipCode进行比较。你和你的邻居有相同的但不一样的。

相关问题