с. 46 «Эффективная Java» Джошуа Блох. Пункт 9: Always переопределить хэш-код при переопределении равноВлияние оптимизации HashMap, которое кэширует хэш-код, связанный с каждой записью, с его методом получения
- Некоторые класса PhoneNumber переопределяет равных() и не отменяет хэш-код()
- «два экземпляра участвуют: один используется для вставки в HashMap, и второй, равный экземпляр используется для (попытки) поиска ». ... »... Даже если два экземпляра произойдет хэш в то же ведро, то получить метод почти наверняка вернется нулевого как HashMap имеет оптимизацию, которая кэширует хэш-код, связанный с каждой записью и не мешает проверке равенства объектов, если хэш-коды не совпадают ».
Вопросы: - почему 'get' вернет 'null', если «два экземпляра происходят с хэшем в том же ведро»?
Какова роль (не получения правильного экземпляра) оптимизации HashMap ", которая использует ..."?
Только для случая - «два экземпляра происходят с хэшем в том же ведре» - что, если HashMap беспокоится о «равенстве объекта, если хэш-коды не совпадают»?
@ajoobe вы сказали: «Таким образом, даже если соответствующий элемент находится в одном ведре, он никогда не может сравниться через .equals и, следовательно, найденный"." , Как это возможно, если у них разные хэш-коды(), как они могут попасть в одно и то же ведро в первую очередь? Можете ли вы прояснить, пожалуйста? – Geek
Хэш-код может быть произвольным int, поэтому каждый хеш-код не может иметь собственный ведро. Следовательно, некоторые объекты с разными хэш-кодами оказываются в одном и том же ковше. – aioobe
@ajoobe: Большое вам спасибо, я был так смущен объектами с разными хэш-кодами в том же ведре. Не могли бы вы дать мне ссылку, в которой подробно объясняется, как управляются операции, такие как изменение размера? –