Независимо от того, как вычисляется хеш-код, вашим методом или по умолчанию из класса Object
, разные объекты могут отображаться в одну и ту же корзину хеш-карт (индекс массива).Хеш-код делится на размер массива, а остаток дает номер корзины.
Оба ваших хеш-кода, полученных с помощью Object.hashCode()
(31622540 и 27844196), производят идентичный остаток 4 при делении на 16(начальный размер массива HashMap).
Таким образом, при наличии 4 миллиардов различных хеш-кодов некоторые из них должны оказаться в одном сегменте, так как выделение 4 миллиардов будет пустой тратой памяти.массив элементов для каждой хеш-карты.
Чтобы хеш-карта работала должным образом, важно, чтобы равные объекты давали одинаковый хеш-код.
Если вы переопределяете только метод equals()
Object.hashCode()
не удовлетворяет этому требованию, и вам также необходимо переопределить hashCode()
- в противном случае метод get()
не найдет объекты, сохраненные на карте.
Если вы хотитедва фильма должны быть equals()
, если их поля равны, вы должны указать соответствующий метод hashCode()
, как вы это сделали.
Давайте посмотрим на возможное переопределение cКомбинации.
Ничего не переопределить
Оба фильма различны, в итоге получаются разные записи хеш-карты, возможно, в одном и том же, а может быть в разных сегментах.
Только переопределить hashCode ()
Оба фильма отличаются друг от друга, и в итоге получаются разные записи хеш-карты в одном и том же сегменте.Нет смысла изобретать собственную реализацию hashCode()
, если вы все еще используете определение равенства Object
.
Переопределите оба hashCode () и equals ()
Оба фильма равны, в конечном итогекак только одна запись хеш-карты, с сохраненным позже значением выигрыша.Это происходит потому, что второй put()
находит запись с равным ключом под корзиной хеш-кода и просто заменяет его часть значения.
Только переопределение равно ()
БОЛЬШАЯ ОШИБКА!Оба фильма одинаковы, но это не отражается в вычислениях hashCode()
, так что это просто вопрос удачи, если поиск существующего значения смотрит в правильную корзину.