equals()
equals() сравнивает содержимое объектов. Обычно это называется сравнением на равенство, и если метод equals() не переопределен, то внутренне он эквивалентен ==, что означает сравнение на идентичность. Поэтому, если вы хотите правильно сравнивать объекты на равенство, вы обязательно должны использовать equals().
hashCode()
hashCode() проверяет, являются ли два объекта одним и тем же объектом. Он выполняет функцию сравнения на идентичность, как и ==, но метод hashCode() возвращает в качестве результата уникальное целочисленное значение объекта во время выполнения. Обычно возвращается адрес памяти объекта, хранящегося в куче.
Этот метод имеет ключевое слово native, которое используется, когда язык, разработанный на другом языке, кроме Java, используется в Java.
Что такое хэш?
Хеширование — это процесс использования хэш-функции для генерации выходного значения фиксированного размера из входного значения переменного размера. Полученное значение называется хэш-кодом.
equals() и hashCode()
Так как идентичные объекты должны иметь один и тот же адрес памяти, то очевидно, что идентичные объекты должны иметь один и тот же хэш-код. Поэтому желательно переопределять не только equals(), но и hashCode(), чтобы гарантировать одинаковый хэш-код.
Структура данных хэш
Давайте добавим два эквивалентных объекта в структуру данных HashSet, как показано выше. Если вы выведете размер этого Set, он будет равен 2. Почему?
Это связано с тем, что структуры данных, использующие хэширование, используют hashCode() для определения ключа. То есть перед сравнением объектов на равенство сравниваются их хэш-коды, а затем проверяется, являются ли они эквивалентными. Если hashCode() не переопределен, то будет использоваться hashCode() из класса Object, который возвращает адрес памяти, по которому хранится каждый объект. Поэтому, при использовании хэш-структур данных, рекомендуется переопределять не только equals(), но и hashCode().
Источник
Ожидаемые вопросы на собеседовании и ответы
Почему equals() и hashCode() используются вместе?
Это связано с тем, что структуры данных, использующие хэширование, используют hashCode() для определения ключа. То есть перед сравнением объектов на равенство сравниваются их хэш-коды, а затем проверяется, являются ли они эквивалентными. Если hashCode() не переопределен, то будет использоваться hashCode() из класса Object, который возвращает адрес памяти, по которому хранится каждый объект. Поэтому, при использовании хэш-структур данных, рекомендуется переопределять не только equals(), но и hashCode().
Комментарии0