13

重複の可能性:
Java で equals と hashCode をオーバーライドする

私が持っている場合

class A {
    int x = 1;
}
...
A a1 = new A();
A a2 = new A();
a1.equals(a2);

equals メソッドをオーバーライドせずに A の 2 つのインスタンスを比較すると、期待どおりの結果が得られますか?

4

3 に答える 3

32

equals メソッドをオーバーライドせずに A の 2 つのインスタンスを比較すると、期待どおりの結果が得られますか?

それはあなたが期待するものに依存します:)

デフォルトの実装では、参照の等価性が得られます。つまり、2 つの参照を比較するとequals、それらが同じオブジェクトへの参照である場合にのみ true が返されます。

通常、「値の等価性」を実装するためにオーバーライドequalsします。この場合、通常はフィールド値自体が等しいため、2 つの異なるオブジェクトが等しいと見なされます。等しいということの正確な意味は、設計によって異なります。たとえば、2 つのオブジェクトが他の方法で区別できる場合もあります。

をオーバーライドする場合は、と一致するようにオーバーライドするequals必要があります。これにより、クラスのインスタンスをハッシュベースのコレクション (例: ) のキーとして使用できるようになり、正確な参照を使用するのではなく、元のキーと等しいキーに基づいて値を検索できるようになります。元のキー オブジェクト。hashCodeequalsa.equals(b)a.hashCode() == b.hashCode()HashMap

于 2012-10-30T06:55:19.003 に答える
3

equals メソッドをオーバーライドせずに A の 2 つのインスタンスを比較すると、期待どおりの結果が得られますか?

いいえ。2 つの異なるインスタンスを明示的に作成したためです。

なんで?equals のデフォルトの実装では、関連する 2 つのオブジェクトが Java 仮想メモリ内の同じメモリ位置を指しているかどうかをチェックします (このデフォルトの動作は java.lang.Object.equals() で定義されています)。

equals メソッドと hashcode メソッドをオーバーライドする必要があるのはいつですか?

プログラマーが equals() と hashcode() の両方をオーバーライドする最も一般的なシナリオは、関連するクラスのインスタンスを次のように使用する必要がある場合です。

  1. java.util.Map 実装のキー
  2. java.util.Set 実装の値
  3. 同じクラスの 2 つの異なるインスタンス間で値が等しいかどうかをチェックしたい (この場合、equals() のオーバーライドは必須です。hashcode() はそうではありませんが、良いプログラミング方法です)。

equals と hashcode の一般的な契約は次のとおりです。

if a1.equals(a2)
    it is mandatory that a1.hashcode() == a2.hashcode()
if a1.hashcode() == a2.hashcode()
    it is not mandatory that a1.equals(a2)

1日処理するのに十分なデータだと思います:)

于 2012-10-30T07:09:18.260 に答える
2

のデフォルトの実装ではequals、変数が同じオブジェクトを参照しているかどうかをテストします。それが望ましくない場合は、オーバーライドする必要がありますequals。オーバーライドするときはequals、通常hashcode、オブジェクトをハッシュ テーブル (またはハッシュ コードを使用する他のデータ構造) で使用できるようにするためにオーバーライドする必要があります。

于 2012-10-30T06:55:30.187 に答える