hashCode() および equals() メソッドをオーバーライドするカスタム オブジェクトの 2 つのセット (LinkedHashSet) があります。
これら 2 つのセットを比較すると、ハッシュ コードが同じであっても 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
ハッシュコードの比較:true
ドキュメントによると、ハッシュ コードが同じ場合、equals メソッドは true を返す必要があります。
セットのハッシュ コードは、セット内の要素のハッシュ コードの合計と定義されます。ここで、null 要素のハッシュ コードはゼロと定義されます。これにより、s1.equals(s2) は、Object.hashCode() の一般的な規約で要求されるように、任意の 2 つのセット s1 および s2 に対して s1.hashCode()==s2.hashCode() を暗示します。
https://docs.oracle.com/javase/7/docs/api/java/util/Set.html#equals(java.lang.Object)
なぜこれが起こっているのですか?