2017-01-17 1 views
2

Я заметил в примерах hashCode(), каждый использует те же поля для вызова hashCode() внутри определения метода hashCode().Зачем мне нужно вызывать/инициализировать метод hashCode() для каждого члена класса?

Почему я должен вызвать/инициализировать метод hashCode() для каждого члена класса, так как хеш-код предназначен для нахождения местоположения объекта (исправьте меня, если я ошибаюсь)?

Итак, в чем цель вызова метода hashCode() в определении метода hashCode().

Например:

public int hashCode() { 
    final int seed = 37; 
    int result = 1; 
    result = seed * result + ((name == null) ? 0 : name.hashCode()); 
    result = seed * result + age; 
    result = seed * result + marks; 
    return result; 
} 

Здесь мы имеем два поля age и name. Какова цель name.hashCode() на линии нет 4.

+0

См. Также: https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html#hashCode-- повторное использование hashCode является обычной практикой, поскольку оно будет следовать контракту для этого поля , Но никто не заставляет вас это делать. 'age', вероятно, является int, поэтому вы не можете вызвать hashCode() на нем ... – Fildor

+0

Ok. Я понял. Но мой вопрос - почему ??? означает, почему нам нужно вызывать hashCode() над не примитивными членами? –

ответ

1

Метод hashCode используется коллекции как HashMap и HashSet распространять экземпляры вашего объекта таким образом, что они будут быстро получить (с временной сложностью O(1)). Чем лучше ваш метод hashCode, тем эффективнее будут эти коллекции при использовании с экземплярами вашего объекта. Хорошо реализованный метод hashCode ограничил бы вероятность получения хэш-коллизий, другими словами, это ограничило бы возможность получения одного и того же хэш-кода для двух экземпляров разных объектов.

Зная, что, если мы удалим строку # 4 от реализации ваших hashCode «S, мы бы тогда все экземпляры объекта с тем же age и marks что бы тот же полученный хэш-код независимо от значения name, поэтому вероятность получения хэш-коллизий высока, что не требуется, как объяснялось выше.

Так с hashCode возвращает 32 бит целых и name, очевидно, String (по крайней мере, не примитивный типа), мы называем hashCode() на нем, чтобы получить int представление String для того, чтобы добавить как-то его значение в результате хэш-код. Благодаря этому экземпляры 2 объектов с теми же age и marks не обязательно будут иметь один и тот же хэш-код, риск получения хэш-коллизий ограничен, что мы и ожидаем.

+1

Большое спасибо @Nicolas Filtto Это то, что я хочу знать. Я никогда не забуду причину использования hashCode() для не примитивного типа. ваш ответ очень полезен для понимания. !! –

1

Я думаю, что более общая форма этого вопроса уже задавался -

Best implementation for hashCode method

Суммируя это касается вашего вопроса, «имя» является объектом String, а «age» является int literal. Начальное значение обычно представляет собой простое число.

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