Выбор ответа Junior ООП и класс Object спрашивают часто обновлено
equals без hashCode
Вопрос
В классе User переопределили equals по полю email, а hashCode не трогали. Что вернёт set.contains(new User("a@b.ru")), если в HashSet уже лежит пользователь с тем же email?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: Скорее всего false: hashCode разный, поиск идёт не в ту корзину. HashSet сначала считает hashCode, выбирает корзину и только в ней вызывает equals.
Варианты ответа
- Скорее всего
false: hashCode разный, поиск идёт не в ту корзинуправильный ответ - Всегда
true: HashSet сравнивает элементы через equals - Будет выброшено исключение о нарушении контракта equals/hashCode
- Код не скомпилируется: equals без hashCode переопределять нельзя
Разбор
HashSet сначала считает hashCode, выбирает корзину и только в ней вызывает equals. Унаследованный Object.hashCode у двух разных объектов почти всегда разный, поэтому поиск идёт в другую корзину и возвращает false. «Всегда true» неверно: до equals дело не доходит. Исключений и ошибок компиляции нет, контракт никто не проверяет, поэтому ошибка и коварная.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.