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