Сначала вызывается
hashCode(), чтобы определить, в какой бакет попадёт ключ.Внутри бакета вызывается
equals(), чтобы проверить, есть ли уже такой ключ.Если переопределить только equals(), но оставить дефолтный
hashCode() (по адресу в памяти), получится проблема. Два объекта, которые равны по equals(), могут иметь разные хэши. Тогда они попадут в разные бакеты, и HashMap воспримет их как разные ключи.Итог: поиск по ключу может “ломаться”, значения будут “теряться”, а одинаковые по смыслу ключи могут храниться дублирующимися.
Поэтому существует контракт: если объекты равны по
equals(), они обязаны возвращать одинаковый hashCode(). В противном случае любые коллекции на основе хэшей (HashMap, HashSet, Hashtable) будут вести себя неправильно.👉 Вывод прост. Всегда переопределяй
equals() и hashCode() вместе.👉 Java Portal
