Что произойдёт при добавлении в HashSet элемента, который там уже есть?
- Как 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 внутри?
Разбор темы
- Set: HashSet, LinkedHashSet, TreeSet
Почему Set построен поверх Map, три реализации и их гарантии порядка, роль equals/hashCode.
Связанные вопросы
Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.