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

