自分のクラスを書くとき、常にオーバーライドする必要がありますequals(Object o)
か?
そうしないと、すべてのフィールドが同じであることが自動的にチェックされますか?それとも、2つの変数が同じオブジェクトを指しているかどうかをチェックするだけですか?
自分のクラスを書くとき、常にオーバーライドする必要がありますequals(Object o)
か?
そうしないと、すべてのフィールドが同じであることが自動的にチェックされますか?それとも、2つの変数が同じオブジェクトを指しているかどうかをチェックするだけですか?
equals()
意味がある場合にのみオーバーライドします。ただし、明らかにオーバーライドする場合は、コントラクトが破られていないequals()
ことを確認する必要があります。つまり、2つのオブジェクトが等しい場合、それらは同じハッシュコードを持っている必要があります。hashcode()
いつ意味がありますか?Object.equals()
不十分な場合。そのメソッドは基本的に参照IDに帰着します。つまり、2つのオブジェクトは同じオブジェクトであるため、次のようになります。
a.equals(b) iff q == b
Integer(10)
数字は、別のと等しいはずなので、それが理にかなっている場合の明白な例Intger(10)
です。
もう1つの例は、データベースレコードを表す場合です。一意の整数IDを持つStudentレコードがあるとすると、IDフィールドを単純に比較するのにequalsを実装するだけで十分な場合があります。
クラスObjectのequalsメソッドは、オブジェクトに対して可能な限り最も識別力のある同値関係を実装します。つまり、null以外の参照値xおよびyの場合、このメソッドは、xとyが同じオブジェクトを参照している場合にのみtrueを返します(x == yの値はtrueです)。
2つのオブジェクトが同等の意味で等しい(同じ情報を含む)かどうかをテストするには、equals()メソッドをオーバーライドする必要があります。恒等演算子がクラスに適していない場合は、常にequals()メソッドをオーバーライドする必要があります。
通常、hashCodeメソッドの一般的なコントラクトを維持するために、このメソッドがオーバーライドされるたびにhashCodeメソッドをオーバーライドする必要があることに注意してください。これは、等しいオブジェクトには等しいハッシュコードが必要であると述べています。
IDEに依存するべきではありませんが、Eclipseは、Alt + Shift + sを押して、equalsおよびhashCodeメニューオプションを選択することにより、この固定機能を提供します。toStringオプションもあります。 Josh Blochによる効果的なJavaには、このテーマに関する優れた情報があります。リンクをクリックすると、このトピックについて説明しているGoogleブックスでホストされている章に移動します。