Может ли Set быть одновременно отсортированным и упорядоченным

«Может ли Set быть одновременно отсортированным и упорядоченным» — вопрос из категории Java, который задают на 24% собеседований AQA / Automation. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Да, может, если использовать конкретную реализацию Set, которая обеспечивает эти свойства.

  • HashSet: Не гарантирует никакого порядка (ни порядка вставки, ни сортировки).
  • LinkedHashSet: Сохраняет порядок вставки элементов. Он упорядоченный, но не отсортированный по значению.
  • TreeSet: Элементы автоматически сортируются согласно их естественному порядку (Comparable) или переданному компаратору (Comparator). TreeSet является и отсортированным, и упорядоченным (порядок определяется сортировкой).

Пример с TreeSet:

Set<Integer> numbers = new TreeSet<>();
numbers.add(10);
numbers.add(1);
numbers.add(5);
System.out.println(numbers); // Вывод: [1, 5, 10] - отсортировано по возрастанию.

// TreeSet с кастомным компаратором (обратная сортировка)
Set<String> reversedNames = new TreeSet<>(Comparator.reverseOrder());
reversedNames.add("Alice");
reversedNames.add("Bob");
reversedNames.add("Charlie");
System.out.println(reversedNames); // Вывод: [Charlie, Bob, Alice]

Таким образом, TreeSet — это реализация Set, которая одновременно является и отсортированной, и упорядоченной.