web-dev-qa-db-ja.com

java.lang.Comparableと等しい

クラスにJava.lang.Comparableを実装した場合でも、equals()メソッドをオーバーライドする必要がありますか?または、Comparableequalsでも機能しますか?

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

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

25
aps

a.compareTo(b) == 0を持つことはa.equals(b)(およびその逆)を意味することが推奨されます(そしてかなり賢明です)が、そうではありませんnot必須。 Comparableは、一連のオブジェクトで順序付けを実行するときに使用することを目的としていますが、equals()は真っ直ぐな同等性をテストするだけです。

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

29
dlev

Java.lang.Comparable のJavadocから:

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

7

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

BigDecimal APIを見てください: http://download.Oracle.com/javase/1,5.0/docs/api/Java/math/BigDecimal.html#equals(Java.lang.Object)

5
gnomed

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

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

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

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

a.compareTo(b) != 0

たとえ

a.equals(b) == true
1
SharkAlley