2011-08-07 12 views
23

クラスにjava.lang.Comparableを実装しても、equals()メソッドをオーバーライドする必要がありますか?またはComparableequalsでも同様に動作しますか?java.lang.Comparable and equals

答えがでない場合、の場合、矛盾が生じたらどうなりますか? equals()メソッド内で2つのオブジェクトを等価とする方法が、のcompareTo()内の等しいクラスの2つのオブジェクトを指す方法と異なります。

Comparableを実装している場合は、equals()も上書きする必要がありますか?

答えて

26

a.compareTo(b) == 0a.equals(b)(およびその逆)ことを意味するものである、それはが必要とされていないことをお勧めします(とはかなり賢明な)されている間。 Comparableは、一連のオブジェクトに対して注文を行うときに使用されることを意図していますが、equals()はまったく同じことをテストするだけです。

This linkには、compareToを正しく実装するための情報があります。

+0

+1ここに関連する有効なJavaの章(項目11を参照)へのリンクの

a.compareTo(b) != 0 

にもかかわらず、2つのオブジェクトを含んでいてもよいですhttp://java.sun.com/developer/Books/effectivejava/Chapter3.pdf – MByD

+0

@MByDリンクをありがとう。それは(意外にも)私よりも優れている! – dlev

+0

@MbyDリンクに感謝します。電話してもよろしいですか?compareTo(b)またはcompare()を直接実行しますか? – aps

7

java.lang.ComparableのJavadocを投稿者:

ことを強く自然順序付けがequalsと一貫性があることを(必須ではありません)をお勧めします。

0

は、私は同じクラス の2つのオブジェクトを名づける 方法は方法は異なっている)のは、私が(等号内等しいと2つのオブジェクトを名付ける方法を言ってみましょうComparableのtoCompare()内で等しいか?

あなたがこれを行うには、あなたがを設定ソートにこれらのオブジェクトを置く場合は、セットが不正な動作します。 From the docs on SortedSet

ソートセットが正しくSetインタフェースを実装するのであればソートセットによって維持順序が( 明示的なコンパレータが提供されているかどうか)equalsと一致していなければならないことに注意してください。

たとえば、TreeSetは(誤って)

a.equals(b) == true 
+1

すべての 'TreeSet'演算は' compareTo'を使って実行されます - 比較が '!= 0'を返すオブジェクトは別個と見なされ、' == 0'を返すオブジェクトは同じです。セットは実際に保持されます)。 Javadocは次のように述べています。「並べ替えられたセットの振る舞いは、その順序付けがequalsと矛盾していてもうまく定義されています。それはSetインターフェースの一般契約に従わないだけです。 –