私が持っている場合
class A {
int x = 1;
}
...
A a1 = new A();
A a2 = new A();
a1.equals(a2);
equals メソッドをオーバーライドせずに A の 2 つのインスタンスを比較すると、期待どおりの結果が得られますか?
私が持っている場合
class A {
int x = 1;
}
...
A a1 = new A();
A a2 = new A();
a1.equals(a2);
equals メソッドをオーバーライドせずに A の 2 つのインスタンスを比較すると、期待どおりの結果が得られますか?
equals メソッドをオーバーライドせずに A の 2 つのインスタンスを比較すると、期待どおりの結果が得られますか?
それはあなたが期待するものに依存します:)
デフォルトの実装では、参照の等価性が得られます。つまり、2 つの参照を比較するとequals
、それらが同じオブジェクトへの参照である場合にのみ true が返されます。
通常、「値の等価性」を実装するためにオーバーライドequals
します。この場合、通常はフィールド値自体が等しいため、2 つの異なるオブジェクトが等しいと見なされます。等しいということの正確な意味は、設計によって異なります。たとえば、2 つのオブジェクトが他の方法で区別できる場合もあります。
をオーバーライドする場合は、と一致するようにオーバーライドするequals
必要があります。これにより、クラスのインスタンスをハッシュベースのコレクション (例: ) のキーとして使用できるようになり、正確な参照を使用するのではなく、元のキーと等しいキーに基づいて値を検索できるようになります。元のキー オブジェクト。hashCode
equals
a.equals(b)
a.hashCode() == b.hashCode()
HashMap
equals メソッドをオーバーライドせずに A の 2 つのインスタンスを比較すると、期待どおりの結果が得られますか?
いいえ。2 つの異なるインスタンスを明示的に作成したためです。
なんで?equals のデフォルトの実装では、関連する 2 つのオブジェクトが Java 仮想メモリ内の同じメモリ位置を指しているかどうかをチェックします (このデフォルトの動作は java.lang.Object.equals() で定義されています)。
equals メソッドと hashcode メソッドをオーバーライドする必要があるのはいつですか?
プログラマーが 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日処理するのに十分なデータだと思います:)
のデフォルトの実装ではequals
、変数が同じオブジェクトを参照しているかどうかをテストします。それが望ましくない場合は、オーバーライドする必要がありますequals
。オーバーライドするときはequals
、通常hashcode
、オブジェクトをハッシュ テーブル (またはハッシュ コードを使用する他のデータ構造) で使用できるようにするためにオーバーライドする必要があります。