Вопрос проверяет понимание внутренних механизмов HashMap и причин логических ошибок при изменении ключей.
Ключи HashMap должны быть неизменяемыми, потому что их hashCode() и equals() используются для определения места хранения. Если состояние ключа изменится после добавления в карту, HashMap потеряет возможность найти этот элемент. Это приводит к тому, что данные «пропадают» из карты. Ошибка не вызывает исключений и проявляется только логически. Поэтому неизменяемость — критическое требование.
Работа HashMap напрямую зависит от стабильности ключей.
При добавлении элемента:
Вызывается hashCode() ключа
Вычисляется индекс bucket’а
Ключ сохраняется в определенном месте
Если после этого изменить ключ, его новое состояние больше не соответствует исходному bucket’у.
Если изменилось поле, участвующее в:
hashCode()
equals()
то:
поиск через get() не находит ключ
containsKey() возвращает false
remove() не работает
При этом сам объект физически остается внутри карты.
Такие ошибки:
не бросают исключений
проявляются только в runtime
сложно воспроизводятся
часто всплывают под нагрузкой
Ключи должны быть:
неизменяемыми
логически стабильными
без сеттеров для значимых полей
Вывод: неизменяемость ключей гарантирует, что HashMap сможет корректно находить и управлять своими элементами.