Javaのハッシュセットには、各セットの要素を比較する.equalsメソッドがあります。これは順序に関係なくtrueを返しますか?
たとえば、1つのセットに要素{a、b、c}があり、別のセットに要素{b、c、a}があるとします。
これらの2つのセットで.equalsを使用すると、trueが返されますか、それとも並べ替える必要がありますか?
これは true を返すはずです。ドキュメントには次のように書かれています:
指定されたオブジェクトがこのセットと等しいかどうかを比較します。指定されたオブジェクトもセットであり、2 つのセットのサイズが同じで、指定されたセットのすべてのメンバーがこのセットに含まれている場合、true を返します。これにより、 Set インターフェイスのさまざまな実装で equals メソッドが適切に機能することが保証されます。
JavaHashSet
は順序付けされていません–それらには順序付けがありません。したがって、あなたの質問は、提起されたとおりに尋ねることはできません。セット{a,b,c}
はセットと同じ{b,c,a}
です。そうは言っても、HashSet
継承は次のAbstractSet#equals(Object)
ことを教えてくれます:
指定されたオブジェクトがこのセットと等しいかどうかを比較します。
true
指定されたオブジェクトもセットであり、2 つのセットが同じサイズであり、指定されたセットのすべてのメンバーがこのセットに含まれているかどうかを返します。これにより、equals
メソッドがインターフェイスのさまざまな実装で適切に機能することが保証されSet
ます。
HashSet
順序情報を含まないためSet
、並べ替えはセット内で意味がありません。その結果、equals
aSet
はメンバーのみを考慮し、メンバーの順序を無視します。
はい、 Set には暗黙の順序がないため、これは当てはまります。
Comparator を追加するか、TreeSet などの Set の特殊なケースを使用して、セットに順序を適用できます。
ちなみに、セット内の高速比較にはハッシュコードが使用されます。equals コントラクトによると、「等しい」と見なされる 2 つのオブジェクトは、同じハッシュコードを持つ必要があります。
これは、万が一ハッシュコードの衝突が発生した場合にのみ、Set がより時間のかかるメソッドにフォールバックする必要があることを意味します。
ハッシュは本質的に順序付けられていないリストなので、はい、
ハッシュ A に {1,2,3,4,5} が含まれ、ハッシュ B に {3,1,5,4,2} が含まれている場合、それらは等しくなります。