Достаточно ли того, что hashCode вычисляется только из final полей? Может ли хэш всё равно измениться?

Нет: final запрещает переназначение поля, но не изменение объекта, на который оно ссылается. Если hashCode зависит от содержимого изменяемой коллекции или массива, результат может измениться.

Короткий ответ

Что ответить на собеседовании

Нет: final запрещает переназначение поля, но не изменение объекта, на который оно ссылается. Если hashCode зависит от содержимого изменяемой коллекции или массива, результат может измениться.

Подробный разбор

Ответ с пояснениями

Нет: final запрещает переназначение поля, но не изменение объекта, на который оно ссылается. Если hashCode зависит от содержимого изменяемой коллекции или массива, результат может измениться.

Например, final List<String> хранит постоянную ссылку, однако добавление элемента изменяет list.hashCode(). Такой объект опасно использовать ключом HashMap: после изменения поиск может не попасть в прежнюю корзину. Нужны неизменяемые компоненты равенства и защитные копии вложенных данных. Также hashCode может зависеть от внешнего изменяемого состояния, даже если поля формально final.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее