Вопрос с собеседования · Java

Что произойдёт при добавлении в HashSet элемента, который там уже есть?

JuniorКоллекции
Ещё спрашивают так:
  • Как HashSet определяет, что элемент уже есть?
  • Как устроен HashSet?
Коротко

Множество не изменится, а add вернёт false — удобная проверка «элемент новый?».

  • HashSet устроен поверх HashMap: элементы — ключи
  • Дубликат определяют hashCode и equals элемента

А ещё Без переопределённых equals/hashCode два «одинаковых» объекта окажутся разными элементами

Подробно

HashSet хранит элементы как ключи внутреннего HashMap (значение — общий объект-заглушка). При add элемент ищется так же, как ключ в карте: по hashCode находится корзина, затем equals сравнивает с уже лежащими элементами. Если равный найден — множество не меняется и метод возвращает false.

Возвращаемое значение удобно использовать как проверку новизны — отдельный contains не нужен: if (seen.add(id)) process(id);

Ключевое требование — корректные equals и hashCode у класса элемента. Если их не переопределить, сравнение идёт по ссылкам, и два объекта с одинаковыми полями попадут во множество оба. Если переопределить только equals, объекты, скорее всего, попадут в разные корзины и тоже не будут найдены как дубликаты.

И ещё: нельзя менять поля элемента, от которых зависит хеш, пока он лежит во множестве, — его потом не удастся найти и удалить.

Пример

Set<Long> processed = new HashSet<>();
for (long orderId : incoming) {
    if (!processed.add(orderId)) continue; // уже обрабатывали
    handle(orderId);
}

Что хотят услышать

  • Множество не меняется, add возвращает false.
  • Как HashSet проверяет дубликат: hashCode + equals.
  • Последствия неверных equals/hashCode.

Частые ошибки

  • Класть в множество объекты без переопределённых equals и hashCode.
  • Ожидать замены существующего элемента новым.

Проверьте себя

Один верный вариант. Подумайте, потом откройте ответ.

Показать варианты и ответ
  • ✓Ничего, add вернёт false
  • ✗Существующий элемент будет заменён новым, add вернёт true
  • ✗Элемент добавится второй раз
  • ✗Будет брошено исключение о дубликате

Что спросят дальше

  • Чем определяется уникальность в множестве на дереве?
  • Как устроен HashSet внутри?

Разбор темы

Связанные вопросы

Партнёр платформы

Разбор собеседования с sotto

После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.

Разбор собеседования