Объясняя хеш-код для вектора - PullRequest
3 голосов
/ 09 апреля 2011

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

  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 ]

4 голосов
/ 09 апреля 2011

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

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

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

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

2 голосов
/ 09 апреля 2011

Поскольку Vector расширяет 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;
}
...