middle
В каком случае может быть потерян элемент в HashMap
Элемент теряется, когда после его добавления изменяется объект-ключ таким образом, что меняется его hashCode() или результат equals().
Сценарий потери:
- Объект
keyдобавляется в HashMap:map.put(key, value). - Хэш-код key вычисляется, и пара записывается в соответствующую корзину.
- Одно из полей key, участвующее в вычислении hashCode/equals, изменяется.
- При попытке
map.get(key)вычисляется новый hashCode, определяется другая корзина — элемент не найден. - Даже если элемент случайно окажется в той же корзине,
equals()может вернуть false.
Дополнительно: при рехешировании (увеличении capacity) элемент попадет в корзину, вычисленную по новому hashCode. Исходный ключ с измененным hashCode никогда не найдет этот элемент.
Именно поэтому ключи HashMap должны быть неизменяемыми (immutable) или, как минимум, поля, участвующие в hashCode/equals, не должны меняться после добавления в карту.
На собеседовании: объясните через мутабельный ключ. Сформулируйте правило: ключи HashMap должны быть immutable.