我有两组自定义对象(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)
任何想法为什么会发生这种情况?