Получить доступ

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

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

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

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

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

Так подсказку видит пользователь sotto на живом собеседовании — за пару секунд, пока вы думаете вслух.

Подробно

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
  • ✗Элемент добавится второй раз
  • ✗Будет брошено исключение о дубликате
  • ✗Существующий элемент будет заменён новым

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

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

Разбор темы

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

Закрытая бета

Подсказки на собеседовании — в реальном времени

sotto слышит вопрос интервьюера и показывает короткий ответ и план, как в блоке «Коротко». Оставьте контакт — пришлём доступ и промокод.

  • Промокод на 2 часа — сверх пробных 30 минут
  • Программа для Windows — скачать сразу, войти — через Яндекс ID или VK ID
  • Прямая связь с разработчиком: что улучшить — сделаем