我有兩個集合(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)
任何想法,爲什麼發生這種情況?
equals()不取決於* on hashCode()。實施者需要確保一致的行爲。 AKA你的自定義對象有問題。 –
「a暗示b」並不意味着「b暗示a」。 –
由於哈希衝突,不相等的對象可能具有相同的哈希碼。 –