equals をオーバーライドする場合は、hashCode もオーバーライドする必要があることを認識しています。compareTo のオーバーライドに適用される同様のルールはありますか?
これは Java の質問です。
equals をオーバーライドする場合は、hashCode もオーバーライドする必要があることを認識しています。compareTo のオーバーライドに適用される同様のルールはありますか?
これは Java の質問です。
その期待はここで読むことができます: http://docs.oracle.com/javase/7/docs/api/java/lang/Comparable.html
あなたにとって最も関心のある部分は、おそらく次のとおりです。
自然な順序付けが equals と一致することを強くお勧めします (必須ではありません)。これは、明示的な比較子のないソートされたセット (およびソートされたマップ) が、自然な順序付けが equals と矛盾する要素 (またはキー) で使用されると、「奇妙な」動作をするためです。特に、そのようなソート済みセット (またはソート済みマップ) は、equals メソッドに関して定義されているセット (またはマップ) の一般規約に違反しています。
JavaDocsで説明されています:
クラスの自然な順序付けは、クラスのすべてのおよびのと同じブール値を持つ場合にのみ、等号と一致する
C
と言われますe1.compareTo(e2) == 0
e1.equals(e2)
e1
e2
C
必須ではないことに注意してください。つまり、 に従って 2 つのクラスが等しい場合、compareTo()
保持する必要はありませんequals()
。たとえば、年齢で人を並べ替えることができるので、これは問題Comparator<Person>
ありません.
ただし、この特定のケースでは、年齢が等しい場合はコンパレータにセカンダリ属性を追加することをお勧めします (したがって、並べ替えは常に安定しており、同じ年齢の人の間で予測可能です) compareTo()
。
のドキュメントにComparator
は、次の注意事項があります。
要素のセット S にコンパレータ c によって課される順序付けは、e1 ごとに c.compare(e1, e2)==0 が e1.equals(e2) と同じブール値を持つ場合に限り、equals と一致すると言われます。および S の e2。
並べ替えられたセット (または並べ替えられたマップ) を並べ替えるために equals と矛盾する順序付けを課すことができる比較演算子を使用する場合は、注意が必要です。明示的なコンパレータ c を持つソート済みセット (またはソート済みマップ) が、セット S から引き出された要素 (またはキー) で使用されているとします。c によって S に課せられた順序付けが equals と矛盾する場合、ソート済みセット (またはソート済みマップ) は次のようになります。 「奇妙」に振る舞う。特に、ソートされたセット (またはソートされたマップ) は、セット (またはマップ) の一般的な契約に違反します。これは、等しいという観点から定義されています。
同じタイプの 2 つのオブジェクトを比較するために使用するオブジェクトには、特定のプロパティまたは属性が必要です。