Объяснение хэш-кода вектору


Могу ли я получить представление о том, как хэш-код принимает значения за элемент, добавленный к вектору?

  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
2 3

2 ответа:

Он работает одинаково для каждой (истинной) реализации интерфейса списка (если он поддерживает добавление элементов). Поведение метода .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());
 }

Это гарантирует, что list1.equals(list2) подразумевает, что list1.hashCode()==list2.hashCode() для любых двух списков, list1 и list2, как того требует генеральный договор Object.hashCode().

Как показал glowcoder, AbstractList содержит только эту реализацию, и поэтому не каждый исполнитель интерфейса List должен делать это снова.

Например, вы также можете написать Arrays.asList("1", "2").hashCode() и получить те же 2530 (до тех пор, пока вы не измените реализацию hashCode() String).

Поскольку вектор расширяет AbstractList, он использует его для своего хэш-кода. Вот что он делает.

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;
}