Главная причина в том, что неизменяемые объекты гарантируют постоянный хеш-код. Метод hashCode() генерирует значения на основе полей объекта. Если объект изменяемый, его поля могут меняться, и hashCode() будет возвращать разные значения в разные моменты времени.
Когда ты используешь изменяемый объект в качестве ключа HashMap:
hashCode() возвращает значение X → HashMap сохраняет его в бакете XhashCode() возвращает значение YYНеизменяемые ключи предотвращают эту проблему, гарантируя:
hashCode() никогда не меняется после создания объектаХотя компилятор Java не требует неизменяемости для ключей HashMap, хорошей практикой считается всегда использовать неизменяемые объекты в качестве ключей. Типичные примеры:
StringIntegerLongfinal-полями и без сеттеровСледование этому принципу гарантирует корректную работу HashMap и защищает от трудноуловимых багов в продакшн-коде.
Если значение hashCode() объекта-ключа HashMap изменится после вставки из-за мутации, объект станет недоступным из HashMap, даже если он всё ещё существует в карте.
Новый — ещё не проверен сообществом
Вы