Ответ
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().