16

Javaのハッシュセットには、各セットの要素を比較する.equalsメソッドがあります。これは順序に関係なくtrueを返しますか?

たとえば、1つのセットに要素{a、b、c}があり、別のセットに要素{b、c、a}があるとします。

これらの2つのセットで.equalsを使用すると、trueが返されますか、それとも並べ替える必要がありますか?

4

5 に答える 5

12

これは true を返すはずです。ドキュメントには次のように書かれています:

指定されたオブジェクトがこのセットと等しいかどうかを比較します。指定されたオブジェクトもセットであり、2 つのセットのサイズが同じで、指定されたセットのすべてのメンバーがこのセットに含まれている場合、true を返します。これにより、 Set インターフェイスのさまざまな実装で equals メソッドが適切に機能することが保証されます。

于 2013-01-28T04:40:23.570 に答える
8

JavaHashSetは順序付けされていません–それらには順序付けがありません。したがって、あなたの質問は、提起されたとおりに尋ねることはできません。セット{a,b,c}はセットと同じ{b,c,a}です。そうは言っても、HashSet継承は次のAbstractSet#equals(Object)ことを教えてくれます:

指定されたオブジェクトがこのセットと等しいかどうかを比較します。true指定されたオブジェクトもセットであり、2 つのセットが同じサイズであり、指定されたセットのすべてのメンバーがこのセットに含まれているかどうかを返します。これにより、equalsメソッドがインターフェイスのさまざまな実装で適切に機能することが保証されSetます。

于 2013-01-28T04:39:24.893 に答える
2

HashSet順序情報を含まないためSet、並べ替えはセット内で意味がありません。その結果、equalsaSetはメンバーのみを考慮し、メンバーの順序を無視します。

于 2013-01-28T04:39:17.093 に答える
2

はい、 Set には暗黙の順序がないため、これは当てはまります。

Comparator を追加するか、TreeSet などの Set の特殊なケースを使用して、セットに順序を適用できます。

ちなみに、セット内の高速比較にはハッシュコードが使用されます。equals コントラクトによると、「等しい」と見なされる 2 つのオブジェクトは、同じハッシュコードを持つ必要があります。

これは、万が一ハッシュコードの衝突が発生した場合にのみ、Set がより時間のかかるメソッドにフォールバックする必要があることを意味します。

于 2013-01-28T04:40:18.403 に答える
1

ハッシュは本質的に順序付けられていないリストなので、はい、

ハッシュ A に {1,2,3,4,5} が含まれ、ハッシュ B に {3,1,5,4,2} が含まれている場合、それらは等しくなります。

于 2013-01-28T04:39:32.380 に答える