私が知っているのは、equalsをオーバーライドすると、hashCodeもオーバーライドする必要があるということです。 compareToのオーバーライドに適用される同様の規則はありますか?compareToのオーバーライドにはどのような影響がありますか?
これはJavaの質問です。それの
私が知っているのは、equalsをオーバーライドすると、hashCodeもオーバーライドする必要があるということです。 compareToのオーバーライドに適用される同様の規則はありますか?compareToのオーバーライドにはどのような影響がありますか?
これはJavaの質問です。それの
期待はここで読むことができます:あなたに最も興味を持ってもらえるでしょうhttp://docs.oracle.com/javase/7/docs/api/java/lang/Comparable.html
部分はおそらくです:
(必須ではありませんが)自然 ということを強く推奨されます順序は等しいと一致します。これは、 (ソートされたマップ)が明示的コンパレータなしで のequalsと矛盾する自然順序が である要素(またはキー)と共に使用されているときに "不思議な"動作をするためです。特に、そのようなソートセット(またはソートされた マップ)は、equalsメソッドに関して と定義されているset(またはmap)の一般規約に違反しています。
それはJavaDocsで説明されています
クラス
C
のための自然な順序付けを持つ一貫性があると言われているがあれば等しいとe1.compareTo(e2) == 0
は、すべてのe1
ためe1.equals(e2)
と同じboolean値を持つ場合にのみまた、クラスC
のe2
が必要です、つまり2つのクラスがcompareTo()
で等しい場合、それらはequals()
を保持する必要はありません。たとえば、年齢別に人物を並べ替えることができるので、これは問題ありません。同じ年齢の2人がComparator<Person>
に関して等しいとみなされますが、明らかに同等である必要はありません。
しかし、この特定のケースでは、年齢が等しい場合(つまり、同じ年齢の人で並べ替えが常に安定して予測可能な場合)、補助属性を追加して、compareTo()
の同じ属性をすべて含むことが良いアイデアかもしれませんある場合には。
Comparator
のマニュアルは、この注意事項を有する:
素子Sのセットに比較器Cによって課される順序は等しい場合のみならc.compare(E1、E2と一致するように言われている)== 0は、Sのすべてのe1とe2に対してe1.equals(e2)と同じブール値を持ちます。
ソートされたセットを並べるためにequalsと矛盾する順序を付けることができるコンパレータを使用する場合は注意が必要ですまたはソートされた地図)。明示的なコンパレータcを持つソートされた集合(またはソートマップ)が、集合Sから引き出された要素(またはキー)とともに使用されると仮定します。 「奇妙に」行動する。特に、ソートされたセット(またはソートされたマップ)は、set(またはmap)の一般規約に違反します。これはequalsの観点から定義されています。
同じタイプの2つのオブジェクトを比較するために使用するオブジェクトに特定のプロパティまたは属性が必要であると伝えたいだけです。
リンクを投稿した直後に、私は怠け者ではなく、実際にコピーして答えに貼り付けました。 – Corbin