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

Чем HashSet, LinkedHashSet и TreeSet отличаются?

JuniorКоллекции
Ещё спрашивают так:
  • Какое множество выбрать в Java?
Коротко

HashSet — без порядка, операции O(1); LinkedHashSet — помнит порядок вставки, O(1); TreeSet — отсортирован (красно-чёрное дерево), O(log n) и навигация: first, ceiling, subSet.

  • Уникальность: HashSet и LinkedHashSet — hashCode и equals, TreeSet — compareTo или компаратор
  • HashSet — вариант по умолчанию
  • TreeSet не допускает null (естественный порядок)

А ещё Неизменяемое — Set.of(...), без гарантированного порядка

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

Подробно

HashSet построен на HashMap: элементы — ключи. Добавление, удаление, contains — O(1) в среднем. Порядок обхода не определён и может меняться после расширения таблицы.

LinkedHashSet — то же плюс двусвязный список по всем элементам: обход в порядке вставки. Немного больше памяти. Удобен, когда нужна уникальность и стабильный порядок (удалить дубли из списка, сохранив порядок: new LinkedHashSet<>(list)).

TreeSet построен на TreeMap (красно-чёрное дерево): элементы отсортированы по естественному порядку или компаратору. Операции O(log n). Даёт навигацию NavigableSet: first, last, floor, ceiling, headSet, tailSet, subSet, descendingSet. Уникальность определяется сравнением, а не equals.

Выбор: просто уникальность — HashSet; плюс порядок вставки — LinkedHashSet; сортировка или запросы «ближайший», «в диапазоне» — TreeSet.

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

  • Устройство и порядок каждого.
  • Сложность операций.
  • Как определяется уникальность.
  • Когда что выбрать.

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

  • Ожидать порядок вставки от HashSet.

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

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

Показать варианты и ответ
  • ✓HashSet без порядка (O(1)); LinkedHashSet хранит порядок вставки; TreeSet отсортирован (O(log n))
  • ✗TreeSet без порядка, HashSet отсортирован
  • ✗Все три сохраняют порядок вставки
  • ✗LinkedHashSet всегда отсортирован по значению

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

  • На чём основан HashSet?
  • Почему mutable элементы опасны в HashSet?

Разбор темы

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

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

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

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

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