@hsadik

Я запутался в HashMap, как будет верно?

Здравствуйте, я начал свое знакомство с классом HashMap в Java и ввиду расхождений в разных источниках, которые запутали меня, возник вопрос насчет хеширования и поиска нужного индекса в хеш-таблице.

Хеш-функция и хеш-код это вроде бы разные понятия, но почему-то в некоторых статьях я не раз видел, что их смешивают и приравнивают, что вводит меня в дополнительную путаницу. Да и большинство статей с подробным разбором довольно старые. Например, в Java 7 индекс нужной ячейки вычислялся в методе indexFor, сейчас же его нет (использую JDK 12). Прошу помощи, чтобы я смог разобраться и не плутал вокруг этого уже третий день.

Я попробовал посмотреть в документации (я не программист, я учу язык) и попробовал что-то найти. Внутри массива в ячейках лежат узлы (класс Node). В этом классе есть поле hash - это и есть тот самый хеш-код?
Также там есть метод hashCode(), который вычисляется так:

return Objects.hashCode(key) ^ Objects.hashCode(value);

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

Но дальше по классу я нахожу следующий метод: static final int hash(Object key), который уже вычисляется как:

return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);

Описание этого метода в документации мне почти ничего не дало. Это хеш-функция, которая вычисляет нужную ячейку массива? Если нет, то где она?

При добавлении объекта в HashMap, вычисляется хеш (хеш-код) ключа, который мы получаем в результате работы метода hashCode(), а далее хеш-функция в результате своей работы "получает" индексы нужных ячеек массива для вставки?
  • Вопрос задан
  • 126 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы