Для чего в HashMap используется hashCode: для ключа или для значения?

«Для чего в HashMap используется hashCode: для ключа или для значения?» — вопрос из категории Java Core, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В HashMap метод hashCode() используется исключительно для ключа (Key).

Причина: Основная задача HashMap — обеспечить быстрый доступ к значению (Value) по ключу. Хэш-код ключа определяет номер «корзины» (bucket), в которую будет помещена или из которой будет извлечена пара Key-Value.

Как это работает при вставке (put()):

  1. Вычисляется key.hashCode().
  2. На основе хэш-кода определяется индекс корзины в массиве HashMap.
  3. В найденной корзине (связный список/дерево в Java 8+) ищется запись с таким же ключом (проверяется equals()).
  4. Если ключ найден, значение обновляется. Если нет — добавляется новая запись.

Пример и важное следствие:

Map<KeyClass, String> map = new HashMap<>();
KeyClass key = new KeyClass("id", 1);
map.put(key, "value"); // hashCode() вызывается у объекта 'key'

// ОПАСНО: Если изменить состояние ключа, его hashCode может измениться
key.setId("newId"); // Теперь key.hashCode() возвращает другое значение!
String value = map.get(key); // Возвратит null! Ключ "потерян" в другой корзине.

Вывод: Ключи в HashMap должны быть immutable (или, по крайней мере, не менять поля, участвующие в hashCode() и equals()), чтобы избежать потери данных.