В Java методы hashCode() и equals() используются для сравнения объектов и поиска элементов в коллекциях. Эти методы должны быть реализованы с определенным набором правил.
Правила hashCode():
- Если метод equals() возвращает true для двух объектов, то hashCode() для этих объектов должен возвращать одно и то же значение.
- Если метод equals() возвращает false для двух объектов, то hashCode() для этих объектов может возвращать одно и то же значение, но это не обязательно.
Правила equals():
- Рефлексивность: Метод equals() должен возвращать true для объекта идентичного самому себе (a.equals(a)).
- Cимметричность: Если a.equals(b) возвращает true, то b.equals(a) также должен возвращать true.
- Транзитивность: Если a.equals(b) возвращает true и b.equals(c) возвращает true, то a.equals(c) также должен возвращать true.
- Консистентность: Если объекты a и b не меняются, то результат a.equals(b) должен оставаться неизменным.
- Неравенство: a.equals(null) должен возвращать false, а не вызывать исключение.
Эти правила делают возможным корректное сравнение объектов и применение их в различных структурах данных, таких как HashSet или HashMap.
При реализации hashCode() и equals() важно учитывать не только значения полей объекта, но и его реальную сущность и состояние. Также следует позаботиться о реализации hashCode() и equals() во всех классах, который будут использоваться в качестве ключей в HashMap или HashSet, так как это позволит корректно их использовать в Java.
Хеш-код — это число. Если более точно, то это битовая строка фиксированной длины, полученная из массива произвольной длины. В терминах Java, хеш-код — это целочисленный результат работы метода, которому в качестве входного параметра передан объект.
Этот метод реализован таким образом, что для одного и того же входного объекта, хеш-код всегда будет одинаковым. Следует понимать, что множество возможных хеш-кодов ограничено примитивным типом int, а множество объектов ограничено только нашей фантазией. Отсюда следует утверждение: “Множество объектов мощнее множества хеш-кодов”. Из-за этого ограничения, вполне возможна ситуация, что хеш-коды разных объектов могут совпасть.
Здесь главное понять, что:
- Если хеш-коды разные, то и входные объекты гарантированно разные.
- Если хеш-коды равны, то входные объекты не всегда равны.
Ситуация, когда у разных объектов одинаковые хеш-коды называется — коллизией. Вероятность возникновения коллизии зависит от используемого алгоритма генерации хеш-кода.
1606 вопрос-ответ по Java: https://github.com/DEBAGanov/interview_questions
Tелеграмм канал: https://t.me/DEBAGanov
Мое резюме: https://github.com/DEBAGanov