2016-03-06 48 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進行比較。你和你的鄰居有相同的但不一樣的。

相關問題