28

クラスに実装する場合、メソッドjava.lang.Comparableをオーバーライドする必要はありますか? equals()それともComparableうまくequalsいきますか?

答えが「いいえ」の場合、何らかの不一致が生じた場合はどうなりますか? メソッド内で 2 つのオブジェクトを等しいと呼ぶ方法は、同じクラスの 2 つのオブジェクトを の中で等しいとequals()呼ぶ方法とは異なるとしましょう。compareTo()Comparable

さらに、 を実装する場合Comparable、 もオーバーライドする必要がありますequals()か?

4

4 に答える 4

30

a.compareTo(b) == 0それを暗示することは推奨されますが(そしてかなり賢明ですa.equals(b))、必須ではありません。Comparable一連のオブジェクトで順序付けを実行するときに使用することを目的としていますが、equals()単純に等しいかどうかをテストするだけです。

このリンクには、適切に実装するための良い情報がcompareToあります。

于 2011-08-07T05:17:52.860 に答える
8

java.lang.Comparableの Javadoc から:

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

于 2011-08-07T05:20:12.717 に答える
5

推奨されていますが、同じ動作をする必要はありません.equals().compareTo()

equals() メソッドの BigDecimal Docs を見てください。

compareTo とは異なり、このメソッドは、2 つの BigDecimal オブジェクトの値とスケールが等しい場合にのみ等しいと見なします (したがって、このメソッドで比較した場合、2.0 は 2.00 と等しくありません)。

BigDecimal は Java のコア クラスであり、 and に対して異なる動作をしequals()compareTo()比較可能なものと真に等しいものとの 2 つのオブジェクトの違いの良い例として機能します。

于 2011-08-07T05:21:59.847 に答える
1

equals() メソッド内で 2 つのオブジェクトを等しいと呼ぶ方法は、Comparable の toCompare() 内で同じクラスの 2 つのオブジェクトを等しいと呼ぶ方法とは異なるとしましょう。

これを行い、これらのオブジェクトをソート済みセットに入れると、セットは誤動作します。SortedSet のドキュメントから:

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

たとえば、TreeSetには (誤って) 2 つのオブジェクトが含まれる場合があります。

a.compareTo(b) != 0

それでも

a.equals(b) == true
于 2013-06-22T09:05:35.503 に答える