2016-12-13 2 views
2
// this is the hashCode method of Set 
public int hashCode() { 
    int h = 0; 
    Iterator<E> i = iterator(); 
    while (i.hasNext()) { 
     E obj = i.next(); 
     if (obj != null) 
      h += obj.hashCode(); 
    } 
    return h; 
} 



//this is the hashCode method of List 
public int hashCode() { 
    int hashCode = 1; 
    for (E e : this) 
     hashCode = 31*hashCode + (e==null ? 0 : e.hashCode()); 
    return hashCode; 
} 

Почему java использует эти два разных подхода? Есть ли что-либо, связанное с характеристикой Set и List? Почему он использует 31, но не другие цифры? Спасибо!Почему Java реализует другой метод hashcode для Set и ArrayList?

+1

Я ответил на вопрос о List vs Set, потому что я не мог найти никаких других вопросов об этом. Но бит около 31 уже ответил: см. Http://stackoverflow.com/questions/299304, а также другие ответы, если вы ищете, почему хеш-функции используют простые числа. – yshavit

ответ

4

Установки неупорядочены, поэтому {a, b, c} должен иметь тот же хеш-код, что и {c, b, a}. Добавление является коммутативным, поэтому добавление хэш-кодов элементов дает вам это свойство.

Списки упорядочены, так что пока [a, b, c]может иметь один и тот же хэш-код, как [c, b, a], это не нужно - и было бы лучше, если бы он не сделал, так как можно больше неравных объектов должен попытаться иметь не равные хэш-коды. Реализация ArrayList.hashCode имеет это свойство.

Обратите внимание, что набор и список и определить, как реализации должны определить equals и hashCode (Set.hashCode, List.hashCode), так что любой (совместимый) осуществление этих соответствующих коллекций будет выглядеть почти так же. Это дает вам полезное свойство, что набор, содержащий те же элементы, равен (и, следовательно, имеет тот же хэш-код), что и любой другой набор, независимо от базовых реализаций.

+0

Ваш ответ очень ясен. Спасибо! –

Смежные вопросы