2

次の equals と hashCode の実装を試しています。

@Override
public boolean equals(Object obj) {
    return obj != null && hashCode() == obj.hashCode();
}

@Override
public int hashCode() {
    return new HashCodeBuilder().append(myField1).append(myField2).toHashCode();
}

基本的に、同じ を持つ 2 つのクラスがequals返されることを期待しています。これは、hashCode を生成するために使用しているフィールドの値に帰着します。truehashCode

これは、たまたまこれらのフィールドに等しい値を持つさまざまなクラスにも返さtrueれることを認識しています。

質問: そのような実装の落とし穴は何ですか?

4

3 に答える 3

8

ハッシュ衝突。異なるフィールド値を持つインスタンスは、一致するハッシュコードを持っている可能性があるため、同等に比較されます。なぜこれが役立つのかわかりません。

于 2013-06-11T13:27:39.613 に答える
1

Oli が言ったように、同じデータを持つ 2 つのオブジェクトが一致することを確認しますが、同じ hashCode を持つ一致しないオブジェクトも同様です。次のようなオブジェクトのデリケートなデータを比較する必要があります。

public boolean equals(Object obj) {
    if (obj instanceof THISOBJECT) {
        THISOBJECT other = (THISOBJECT) obj;
        return getID.equals(other.getID);
    }
    return false;
}
于 2013-06-11T14:53:59.903 に答える