2012-10-12 9 views
11

Collectionsクラスは、これらのビューオブジェクトの場合などのようunmodifiableSet()などの様々なコレクション型、unmodifiableList()の読み取り専用ビューを提供するために静的ヘルパーメソッドの数、hashCode()を有しequals()メソッドは、基本的なコレクションに呼び出しを転送します... 1つの奇妙な例外:unmodifiableCollection()ハッシュコードと(Collections.unmodifiableCollectionために等しい)

のJavaDoc explicitly states

返されるコレクションははないは、ハッシュコードを渡し、バッキングコレクションに至るまでの操作に等しいが、ObjectequalshashCode方法に依存していません。これは、バッキングコレクションがセットまたはリストである場合に、これらの操作の契約を保持するために必要です。

私の質問:wtfはこれについて話していますか?バッキングコレクションがセットまたはリストの場合、動作はunmodifiableSet()unmodifiableList()と一貫していると思います。それはhashCode/equals契約にどのように違反しますか?コレクションのJavaDocから

答えて

14

はa.equals(b)の場合にだけ B、つまり(対称でなければならないと等しいはObject.equalsメソッドの状態のための一般的な契約。 (a)に等しい)。 List.equalsとSet.equalsのコントラクトでは、 のリストは他のリストと同じものに過ぎず、他のセットに設定されます。したがって、 ListまたはSetインターフェイスを実装しないコレクションクラスのカスタムequalsメソッド は、このコレクションが任意のリストまたはセットと比較して の場合にfalseを返す必要があります。 (同じロジックでは、それは することはできません正しく設定し、一覧 の両方のインターフェイスを実装するクラスを記述します。)

UnmodifiableListUnmodifiableCollectionですが、同じことが逆に本当ではありません - Listを囲むUnmodifiableCollectionは、ではなく、であり、UnmodifiableListである。したがって、List aを囲むUnmodifiableCollectionと、同じリストaをラップするUnmodifiableListを比較すると、2つのラッパーは同じであってはなりません。ラップされたリストを通過したばかりの場合、それらは等しくなります。

関連する問題