0

単一のオブジェクト内の要素を比較するとき、常にメソッドCollectionをオーバーライドする必要がありますか? equalsはいの場合、なぜそれを行う必要がありますか。

CompareTo実際には、戻り値の型と同様に、メソッドを介して整数で要素を比較してい1,0,-1ます。

4

7 に答える 7

2

セットを使用する場合、Java はequals()メソッドを使用してオブジェクトを比較します。ソートされたコレクションを使用している場合は、Comparableインターフェースを実装する必要があります。

デフォルトではequals()、2 つのオブジェクト インスタンスが同じ場合は true になります。比較にさらにロジックを実装する場合は、指定されたメソッドを実装する必要があります。

于 2012-06-25T07:54:32.200 に答える
1

さて、compareTo() メソッドを実装した場合は、compareTo() 自体が等価性をチェックするため、equals() を実装する必要はもうありません。

equals() を個別に実装した場合でも、compareTo() はその実装を非表示にし、オブジェクトが equals() メソッドに対してテストされることはありません。

于 2012-06-25T08:15:35.187 に答える
1

クラスで 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 には優れた自動生成オプションがあります)。

于 2012-06-25T08:00:45.703 に答える
0

はい。常にequalsメソッドをオーバーライドする必要があります。

例:コレクションにnullを追加する場合、 NullPointerExceptionがスローされるため、compareToを使用できません。ただし、equals()はNullPointerExceptionをスローしません。

NullPointerExceptionを回避するには、equals()をオーバーライドする方が安全です。

于 2012-06-25T08:07:39.897 に答える
0

オブジェクトのメソッド Comparableと一貫性を保つために実装が強く推奨しているインターフェースについて話していると思いますが、それでも必須ではありません。同等の説明equals()

于 2012-06-25T08:07:53.000 に答える