← Назад к вопросам
Какую коллекцию будешь использовать для хранения элементов в отсортированном и неповторяющемся виде?
1.0 Junior🔥 261 комментариев
#Коллекции#Основы Java
Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
# TreeSet — оптимальный выбор
Для хранения элементов в отсортированном и неповторяющемся виде в Java используется TreeSet.
Основные характеристики TreeSet
Set<Integer> numbers = new TreeSet<>();
numbers.add(5);
numbers.add(2);
numbers.add(8);
numbers.add(2); // дубликат — не добавится
System.out.println(numbers); // [2, 5, 8]
TreeSet автоматически сохраняет элементы в отсортированном порядке (по умолчанию естественный порядок — natural ordering). Дубликаты не допускаются, как и во всех Set.
Как это работает
TreeSet реализуется на основе красно-чёрного дерева (Red-Black Tree):
- Временная сложность: O(log n) для add(), remove(), contains()
- Пространственная сложность: O(n)
- Сортировка — неотъемлемая часть структуры, не постфактор
Сравнение с альтернативами
| Коллекция | Порядок | Уникальность | Временная сложность |
|---|---|---|---|
| TreeSet | Да (отсортирован) | Да | O(log n) |
| HashSet | Нет | Да | O(1) |
| LinkedHashSet | Да (insertion order) | Да | O(1) |
| TreeMap.keySet() | Да (отсортирован) | Да | O(log n) |
Использование с Comparator
Если нужна кастомная сортировка:
Set<String> sorted = new TreeSet<>((s1, s2) -> s2.compareTo(s1)); // обратный порядок
sorted.add("banana");
sorted.add("apple");
sorted.add("cherry");
System.out.println(sorted); // [cherry, banana, apple]
Важные моменты
- Nullable элементы: TreeSet не может содержать null (будет NullPointerException)
- Потокобезопасность: не потокобезопасен; для многопоточности используй
Collections.synchronizedSortedSet(new TreeSet<>()) - Итерация: гарантированно в отсортированном порядке
- NavigableSet методы:
first(),last(),lower(),higher(),subSet()— полезны для работы с диапазонами
NavigableSet<Integer> numbers = new TreeSet<>(Arrays.asList(1, 3, 5, 7, 9));
System.out.println(numbers.headSet(5)); // [1, 3]
System.out.println(numbers.tailSet(5)); // [5, 7, 9]
System.out.println(numbers.subSet(3, 8)); // [3, 5, 7]
TreeSet — идеальный выбор, когда оба условия критичны: элементы должны быть уникальными И отсортированными.