Как вы используете коллекцию Set в Java и в чем их различия?

«Как вы используете коллекцию Set в Java и в чем их различия?» — вопрос из категории Java Core, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Set — это коллекция, хранящая только уникальные элементы (дубликаты запрещены). Основные реализации и их применение:

Реализация Внутреннее устройство Порядок Время contains() Ключевое использование
HashSet Хэш-таблица (на основе HashMap) Не гарантируется O(1) Основная реализация, когда порядок не важен, а нужна быстрая проверка уникальности.
LinkedHashSet Хэш-таблица + связный список Порядок вставки O(1) Когда нужен HashSet, но требуется сохранить порядок, в котором элементы были добавлены.
TreeSet Красно-черное дерево Сортированный (natural order или Comparator) O(log n) Когда элементы должны быть автоматически отсортированы.

Примеры:

// 1. HashSet — для быстрого удаления дубликатов
Set<String> uniqueWords = new HashSet<>(List.of("java", "python", "java", "c++"));
System.out.println(uniqueWords); // [java, c++, python] (порядок может быть любым)

// 2. LinkedHashSet — для уникальности с сохранением порядка
Set<Integer> orderedSet = new LinkedHashSet<>();
orderedSet.add(5);
orderedSet.add(1);
orderedSet.add(5); // Не добавится
System.out.println(orderedSet); // [5, 1] (порядок вставки сохранен)

// 3. TreeSet — для отсортированного множества
Set<Integer> sortedSet = new TreeSet<>(Comparator.reverseOrder());
sortedSet.add(5);
sortedSet.add(1);
sortedSet.add(10);
System.out.println(sortedSet); // [10, 5, 1] (сортировка по убыванию)

Важные детали:

  • Для корректной работы в HashSet/LinkedHashSet у объектов должны быть правильно переопределены equals() и hashCode().
  • Для TreeSet элементы должны реализовывать Comparable или необходимо передавать Comparator.
  • Set не предоставляет методов для получения элемента по индексу. Для проверки наличия используется contains().