2012-10-30 22 views
12

可能性の重複:
Overriding equals and hashCode in Javaいつequalsメソッドとhashcodeメソッドをオーバーライドする必要がありますか?

私は

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

を持っている場合、私はequalsメソッドをオーバーライドすることなく、Aの2つのインスタンスを比較すると、私は期待した結果を得るのだろうか?

+0

のために処理するのに十分なデータはこれが関連していることと思いますが、HTTPのない複製:// stackoverflowの.com/questions/27581/overriding-equals-and-hashcode-in-javaは、equalsとhasCodeをオーバーライドする方法* how *とオーバーライドするときの*ため*です。 – Raedwald

+0

これはより良い複製であるようです:http://stackoverflow.com/questions/13387742 –

答えて

28

私が2つのインスタンスをequalsメソッドをオーバーライドしないで比較した場合、期待される結果が得られますか?あなたは2つの参照を比較するとき、彼らはへの参照している場合は、他の言葉で、equalsにのみtrueを返します - あなたが期待するものに依存します:)

デフォルトの実装はあなたに参照の等価を与える

同じオブジェクト。

通常は、値の等しいことを実現するために、通常はequalsを上書きします.2つの異なるオブジェクトが等しいとみなされる場合、通常は等しいフィールド値を使用します。平等の正確な意味は、あなたのデザインによって異なります。例えば、2つのオブジェクトは、他の方法でも区別できます。

あなたがequalsをオーバーライドする場合は、equalsと一致するためにオーバーライドhashCode、そのようa.equals(b)がtrueの場合は、その後、a.hashCode() == b.hashCode()ことをする必要があります。これにより、クラスのインスタンスをハッシュベースのコレクション(たとえばHashMap)のキーとして使用できるようになり、参照を使用するのではなく、equalのキーに基づいて値をルックアップできます正確な元のキーオブジェクトに変換します。

+8

これは、equalsメソッドをオーバーライドしないと、equals()は==と同じ働きをしますか? – user926958

+8

@ user926958:はい、正確です。 –

2

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

3

もし私がequalsメソッドをオーバーライドしないで2つのインスタンスを比較すると、 私は期待される結果を得ますか?

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

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

Iが必要ですequalsメソッドとhashcodeメソッドをオーバーライドするには?あなたはjava.util.Mapの実装に

  1. キーとして懸念したクラスのインスタンスを使用する必要がある場合

最も一般的なプログラマは両方のequalsをオーバーライドするシナリオ()とhashCode()がある

  • java.util.Set実装の値
  • 同じクラスの2つの異なるインスタンス間で値の等価性をチェックしたいとします(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) 
    

    私は一日:)

    関連する問題