Hashcode/equals Flashcards
Что такое методы hashCode() и equals()?
Это методы для сравнения объектов, используются для не примитивных типов.
Почему важно переопределять hashCode() и equals()?
Для корректной работы хэш-коллекций, обеспечения согласованности между сравнением объектов и их хэш-кодами, и избежания логических ошибок в программе.
Что нужно делать при переопределении hashCode()?
Если вы переопределяете один из этих методов, всегда переопределяйте и другой, чтобы соблюсти контракт между ними.
Каков контракт между методами equals() и hashCode()?
Обязательно имплементировать оба. Если равны по equals, то hashCode всегда одинаковый. Не должно меняться в жизни объекта.
Каков второй контракт между equals() и hashCode()?
Равны по equals, по hashCode тоже равны. Если равны по hashCode, то не обязательно по equals. Если не равны по hashCode, то по equals тоже не равны.
Что произойдет, если hashCode возвращает одно число?
Будет работать, но будет плохая работа в хэш коллекциях, время будет не логарифмическое, а линейное.
Каковы основные свойства контракта equals()?
Симметричность: x.equals(y) == true, то y.equals(x) == true. Рефлексивность: x.equals(x). Транзитивность: a=b, b=c, a=c.
Что произойдет, если не переопределены equals() и hashCode()?
Вернет false и скажет, что нет такого id.
Для чего нужно хеширование и какие примеры его использования?
Примеры: хешмапы и хешсеты. Если не определены, то будет сложность O(n) вместо O(log N).
Какова основная функция хешкода?
Разбивает объекты на группы с одинаковым хешкодом.
Как изначально определен equals()?
Через identity, сравнивает значения по ссылкам.