16

自分のクラスを書くとき、常にオーバーライドする必要がありますequals(Object o)か?

そうしないと、すべてのフィールドが同じであることが自動的にチェックされますか?それとも、2つの変数が同じオブジェクトを指しているかどうかをチェックするだけですか?

4

4 に答える 4

16

オブジェクトを何らかの方法で比較するクラスを作成する場合は、メソッドequalshashCodeメソッドをオーバーライドする必要があります。

明示的なメソッドを提供しないと、スーパークラスからメソッドequalsの動作が継承されます。スーパークラスがクラスの場合は、クラスのJavaAPI仕様で設定されている動作になります。equalsObjectObject

equalsメソッドを提供するための一般的な契約は、Objectクラスのドキュメント、具体的にはequalshashCodeメソッドのドキュメントに記載されています。

于 2009-10-11T01:16:46.790 に答える
6

equals()意味がある場合にのみオーバーライドします。ただし、明らかにオーバーライドする場合は、コントラクトが破られていないequals()ことを確認する必要があります。つまり、2つのオブジェクトが等しい場合、それらは同じハッシュコードを持っている必要があります。hashcode()

いつ意味がありますか?Object.equals()不十分な場合。そのメソッドは基本的に参照IDに帰着します。つまり、2つのオブジェクトは同じオブジェクトであるため、次のようになります。

a.equals(b) iff q == b

Integer(10)数字は、別のと等しいはずなので、それが理にかなっている場合の明白な例Intger(10)です。

もう1つの例は、データベースレコードを表す場合です。一意の整数IDを持つStudentレコードがあるとすると、IDフィールドを単純に比較するのにequalsを実装するだけで十分な場合があります。

于 2009-10-11T01:36:09.217 に答える
5

クラスObjectのequalsメソッドは、オブジェクトに対して可能な限り最も識別力のある同値関係を実装します。つまり、null以外の参照値xおよびyの場合、このメソッドは、xとyが同じオブジェクトを参照している場合にのみtrueを返します(x == yの値はtrueです)。

2つのオブジェクトが同等の意味で等しい(同じ情報を含む)かどうかをテストするには、equals()メソッドをオーバーライドする必要があります。恒等演算子がクラスに適していない場合は、常にequals()メソッドをオーバーライドする必要があります。

通常、hashCodeメソッドの一般的なコントラクトを維持するために、このメソッドがオーバーライドされるたびにhashCodeメソッドをオーバーライドする必要があることに注意してください。これは、等しいオブジェクトには等しいハッシュコードが必要であると述べています。

于 2009-10-11T01:18:46.053 に答える
2

IDEに依存するべきではありませんが、Eclipseは、Alt + Shift + sを押して、equalsおよびhashCodeメニューオプションを選択することにより、この固定機能を提供します。toStringオプションもあります。 Josh Blochによる効果的なJavaには、このテーマに関する優れた情報があります。リンクをクリックすると、このトピックについて説明しているGoogleブックスでホストされている章に移動します。

于 2009-10-12T04:52:58.930 に答える