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