3

ベクトルに追加された要素ごとに、ハッシュコードがどのように値を取得するかを理解できますか?

  Vector v = new Vector();

  //Add elements to Vector
  v.add("1");
  System.out.println(v.hashCode());
  v.add("2");
  System.out.println(v.hashCode());
  v.add("=");
  System.out.println(v.hashCode());

ハッシュコード値は

 80
 2530
 78491
4

2 に答える 2

4

List インターフェイスのすべての (真の) 実装で同じように機能します (要素の追加をサポートしている場合)。メソッドの動作は、次のよう.hashCodeに定義されList.hashCode()ています。

このリストのハッシュ コード値を返します。リストのハッシュ コードは、次の計算の結果として定義されます。

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

これにより、 の一般契約で要求されるように、任意の 2 つのリスト およびに対して が をlist1.equals(list2)意味することが保証されます。list1.hashCode()==list2.hashCode()list1list2Object.hashCode()

グローコーダーが示したAbstractListように、この実装だけが含まれているため、Listインターフェイスのすべての実装者がこれを再度実行する必要はありません。

たとえば、次のように記述して同じ 2530 を取得することもできます(の実装をArrays.asList("1", "2").hashCode()変更しない限り)。hashCode()String

于 2011-04-09T18:43:24.053 に答える
2

Vector は AbstractList を拡張するため、それを hashCode に使用します。これが何をするかです。

public int hashCode() {
int hashCode = 1;
Iterator<E> i = iterator();
while (i.hasNext()) {
    E obj = i.next();
    hashCode = 31*hashCode + (obj==null ? 0 : obj.hashCode());
}
return hashCode;
}
于 2011-04-09T17:58:26.023 に答える