-1

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)

なぜこれが起こっているのですか?

4

2 に答える 2

5

2 つのオブジェクトが等しい場合、それらは同じハッシュ コードを持っている必要があります。同じハッシュ コードを持つことは、オブジェクトが等しいことを意味しません。

于 2016-03-06T11:12:45.187 に答える
1

同じhashcode()という意味ではありませんequals

それをZipCodeと比較できます。あなたとあなたの隣人は同じですが、同じではありません。

于 2016-03-06T11:12:46.643 に答える