Gymterview
middle

В каком случае может быть потерян элемент в HashMap

Элемент теряется, когда после его добавления изменяется объект-ключ таким образом, что меняется его hashCode() или результат equals().

Сценарий потери:

  1. Объект key добавляется в HashMap: map.put(key, value).
  2. Хэш-код key вычисляется, и пара записывается в соответствующую корзину.
  3. Одно из полей key, участвующее в вычислении hashCode/equals, изменяется.
  4. При попытке map.get(key) вычисляется новый hashCode, определяется другая корзина — элемент не найден.
  5. Даже если элемент случайно окажется в той же корзине, equals() может вернуть false.

Дополнительно: при рехешировании (увеличении capacity) элемент попадет в корзину, вычисленную по новому hashCode. Исходный ключ с измененным hashCode никогда не найдет этот элемент.

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

На собеседовании: объясните через мутабельный ключ. Сформулируйте правило: ключи HashMap должны быть immutable.