Java 两个 Set 对象 - hashCode() 相同但 .equals() 失败
Java two Set objects - hashCode() are the same but .equals() fails
我有两组自定义对象 (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() ) );
这个returns:
cmContacts.equals(cm2Contacts):false
cm2Contacts.equals(cmContacts):false
比较散列codes:true
根据文档,如果哈希码相同,则 equals 方法应该 return 为真。
The hash code of a set is defined to be the sum of the hash codes of the elements in the set, where the hash code of a null element is defined to be zero. This ensures that s1.equals(s2) implies that s1.hashCode()==s2.hashCode() for any two sets s1 and s2, as required by the general contract of Object.hashCode().
https://docs.oracle.com/javase/7/docs/api/java/util/Set.html#equals(java.lang.Object)
知道为什么会这样吗?
你倒过来了:如果两个对象相等,则它们必须具有相同的哈希码。具有相同的哈希码并不意味着对象应该相等。
同样hashcode()
不等于equals
.
您可以将其与邮政编码进行比较。你和你的邻居有相同但不相同
我有两组自定义对象 (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() ) );
这个returns:
cmContacts.equals(cm2Contacts):false
cm2Contacts.equals(cmContacts):false
比较散列codes:true
根据文档,如果哈希码相同,则 equals 方法应该 return 为真。
The hash code of a set is defined to be the sum of the hash codes of the elements in the set, where the hash code of a null element is defined to be zero. This ensures that s1.equals(s2) implies that s1.hashCode()==s2.hashCode() for any two sets s1 and s2, as required by the general contract of Object.hashCode().
https://docs.oracle.com/javase/7/docs/api/java/util/Set.html#equals(java.lang.Object)
知道为什么会这样吗?
你倒过来了:如果两个对象相等,则它们必须具有相同的哈希码。具有相同的哈希码并不意味着对象应该相等。
同样hashcode()
不等于equals
.
您可以将其与邮政编码进行比较。你和你的邻居有相同但不相同