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

Как устроен HashSet внутри?

MiddleКоллекции
Коротко

HashSet — это HashMap: элементы — ключи, значение — общий объект-заглушка. LinkedHashSet построен на LinkedHashMap, TreeSet — на TreeMap.

  • Уникальность — через hashCode и equals ключей
  • Порядок обхода не определён
  • add возвращает false, если элемент уже был

А ещё Отсюда все свойства и ловушки — как у ключей HashMap

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

Подробно

Тот же приём применён и к остальным: LinkedHashSet построен на LinkedHashMap, TreeSet — на TreeMap. Отсюда сразу следуют все свойства множества: уникальность обеспечивается тем же механизмом, что и уникальность ключей карты, то есть парой hashCode и equals; порядок обхода HashSet не определён; добавление и проверка наличия работают в среднем за константу. Именно поэтому объект без корректных hashCode и equals в множестве ведёт себя непредсказуемо — он попадает не в тот бакет и не находится.

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

  • Устройство через HashMap.
  • Следствия для уникальности и порядка.

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

  • Считать, что множество хранит элементы упорядоченно.
  • Класть в HashSet объекты без переопределённых hashCode и equals.

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

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

Показать варианты и ответ
  • ✓Это обёртка над HashMap: элементы становятся ключами, а значением служит общий объект-заглушка
  • ✗Это отсортированный массив с двоичным поиском
  • ✗Это связный список с проверкой equals при каждом добавлении
  • ✗Это красно-чёрное дерево, как и TreeSet

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

  • Какой объект выступает значением-заглушкой и почему он один на все элементы?
  • Чем уникальность в TreeSet отличается от уникальности в HashSet?

Разбор темы

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

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

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

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

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