0

AbstractList の場合、ハッシュ コードは次のように計算されます。

 int hashCode = 1;
 Iterator<E> i = list.iterator();
 while (i.hasNext()) {
     E obj = i.next();
     hashCode = 31*hashCode + (obj==null ? 0 : obj.hashCode());
 }

一方、AbstractSet の場合、次のように計算されます。

int h = 0;
Iterator<E> i = iterator();
while (i.hasNext()) {
    E obj = i.next();
    if (obj != null)
        h += obj.hashCode();
}

質問: AbstractList のハッシュ コード計算が AbstractSet のハッシュ コード計算と同じにならないのはなぜですか? これは、 での要素の重複の可能性と でのList一意の要素の保証と関係がありますかSet、それともそれらのプロパティとの関係orderedですか?un-ordered

4

1 に答える 1

6

絶対。インターフェイスで指定されたハッシュ コードの計算により、同じ要素が異なる方法で並べられた 2 つのリストが異なるList可能性が高くなります。hashCode()インターフェイスで指定されたハッシュ コードは、異なる順序で同じ要素を持つSet2 つの のハッシュ コードが同じであることを保証します。Set

Listこれは、との等価性の異なる概念に自然に対応しSetます。

于 2013-02-08T17:32:59.370 に答える