← Назад к вопросам

Какую коллекцию будешь использовать для хранения элементов в отсортированном и неповторяющемся виде?

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]

Важные моменты

  1. Nullable элементы: TreeSet не может содержать null (будет NullPointerException)
  2. Потокобезопасность: не потокобезопасен; для многопоточности используй Collections.synchronizedSortedSet(new TreeSet<>())
  3. Итерация: гарантированно в отсортированном порядке
  4. 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 — идеальный выбор, когда оба условия критичны: элементы должны быть уникальными И отсортированными.

Какую коллекцию будешь использовать для хранения элементов в отсортированном и неповторяющемся виде? | PrepBro