単一のオブジェクト内の要素を比較するとき、常にメソッドCollection
をオーバーライドする必要がありますか? equals
はいの場合、なぜそれを行う必要がありますか。
CompareTo
実際には、戻り値の型と同様に、メソッドを介して整数で要素を比較してい1,0,-1
ます。
単一のオブジェクト内の要素を比較するとき、常にメソッドCollection
をオーバーライドする必要がありますか? equals
はいの場合、なぜそれを行う必要がありますか。
CompareTo
実際には、戻り値の型と同様に、メソッドを介して整数で要素を比較してい1,0,-1
ます。
セットを使用する場合、Java はequals()
メソッドを使用してオブジェクトを比較します。ソートされたコレクションを使用している場合は、Comparable
インターフェースを実装する必要があります。
デフォルトではequals()
、2 つのオブジェクト インスタンスが同じ場合は true になります。比較にさらにロジックを実装する場合は、指定されたメソッドを実装する必要があります。
さて、compareTo() メソッドを実装した場合は、compareTo() 自体が等価性をチェックするため、equals() を実装する必要はもうありません。
equals() を個別に実装した場合でも、compareTo() はその実装を非表示にし、オブジェクトが equals() メソッドに対してテストされることはありません。
クラスで equals メソッドをオーバーライドしない場合は、スーパー クラスの (通常はjava.lang.Object
) メソッドが呼び出されます。これが必要な場合は、オーバーライドする必要はありませんequals
。
さて、おそらくあなたが望むものではないでしょうObject.equals()
:
クラス Object の equals メソッドは、オブジェクトに対して最も識別可能な等価関係を実装します。つまり、null 以外の参照値 x と y の場合、このメソッドは、x と y が同じオブジェクトを参照している (x == y の値が true である) 場合にのみ true を返します。
たとえばInteger
、 equals メソッドをオーバーライドするため、次のように動作します。
Integer a = new Integer(3);
Integer b = new Integer(3);
assert(a.equals(b)); //Succeeds
そうでない場合、a は b と等しくなりません (Object.equals によると)。したがって、それはあなたが何をする必要があるかによって異なります。ほとんどの Java 標準クラスには既に適切な equals メソッドがあり、それをオーバーライドする必要はありません。ただし、カスタム作成されたクラスはデフォルトで Object.equals() になり、オブジェクトが同じオブジェクト (同じインスタンス、メモリ内の同じバイトの束) であるかどうかがチェックされますが、これは通常、必要なものではありません。
また、HashMap は比較に equals ではなく hashCode を使用し、たとえば TreeSet はComparable
インターフェイス メソッドを使用することに注意してください。通常、equalsをオーバーライドする場合は、同時にhashCodeもオーバーライドすることを忘れないでください (必要に応じて、Eclipse には優れた自動生成オプションがあります)。
はい。常にequalsメソッドをオーバーライドする必要があります。
例:コレクションにnullを追加する場合、 NullPointerExceptionがスローされるため、compareToを使用できません。ただし、equals()はNullPointerExceptionをスローしません。
NullPointerExceptionを回避するには、equals()をオーバーライドする方が安全です。
オブジェクトのメソッド
Comparable
と一貫性を保つために実装が強く推奨しているインターフェースについて話していると思いますが、それでも必須ではありません。同等の説明equals()