Выбор ответа Junior ООП и класс Object спрашивают часто обновлено

equals без hashCode

Вопрос

В классе User переопределили equals по полю email, а hashCode не трогали. Что вернёт set.contains(new User("a@b.ru")), если в HashSet уже лежит пользователь с тем же email?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: Скорее всего false: hashCode разный, поиск идёт не в ту корзину. HashSet сначала считает hashCode, выбирает корзину и только в ней вызывает equals.

Варианты ответа

  1. Скорее всего false: hashCode разный, поиск идёт не в ту корзинуправильный ответ
  2. Всегда true: HashSet сравнивает элементы через equals
  3. Будет выброшено исключение о нарушении контракта equals/hashCode
  4. Код не скомпилируется: equals без hashCode переопределять нельзя

Разбор

HashSet сначала считает hashCode, выбирает корзину и только в ней вызывает equals. Унаследованный Object.hashCode у двух разных объектов почти всегда разный, поэтому поиск идёт в другую корзину и возвращает false. «Всегда true» неверно: до equals дело не доходит. Исключений и ошибок компиляции нет, контракт никто не проверяет, поэтому ошибка и коварная.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.