Какой порядок элементов гарантируют различные реализации Set в Java?

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

Ответ

Порядок элементов в Set зависит от конкретной реализации:

Реализация Гарантия порядка Основание для хранения
HashSet Не гарантируется Хэш-таблица (на основе hashCode()). Порядок может меняться при изменении размера внутренней структуры.
LinkedHashSet Порядок вставки (insertion-order) Расширяет HashSet, добавляя двусвязный список, который сохраняет последовательность добавления элементов.
TreeSet Порядок сортировки (sorted-order) Красно-чёрное дерево. Элементы сортируются согласно их natural ordering (интерфейс Comparable) или переданному Comparator.

Пример:

Set<String> hashSet = new HashSet<>(Arrays.asList("banana", "apple", "cherry"));
System.out.println(hashSet); // Возможный вывод: [apple, cherry, banana] (порядок непредсказуем)

Set<String> linkedSet = new LinkedHashSet<>(Arrays.asList("banana", "apple", "cherry"));
System.out.println(linkedSet); // Гарантированный вывод: [banana, apple, cherry]

Set<String> treeSet = new TreeSet<>(Arrays.asList("banana", "apple", "cherry"));
System.out.println(treeSet); // Гарантированный вывод: [apple, banana, cherry] (лексикографический порядок)