Какая реализация Set в Java сохраняет порядок добавления элементов?

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

Ответ

Для сохранения порядка добавления элементов используется LinkedHashSet.

Как это работает: LinkedHashSet расширяет HashSet, сохраняя все его преимущества (время доступа ~O(1)), но внутри поддерживает двусвязный список, который фиксирует порядок вставки элементов.

Пример использования:

Set<String> orderedSet = new LinkedHashSet<>();
orderedSet.add("first");
orderedSet.add("second");
orderedSet.add("third");
orderedSet.add("first"); // Дубликат игнорируется

// Порядок вывода гарантирован: first, second, third
for (String item : orderedSet) {
    System.out.println(item);
}

Ключевые особенности:

  • Гарантирует порядок вставки (не путать с сортировкой).
  • Время выполнения операций add(), contains(), remove() — в среднем O(1).
  • Потребляет немного больше памяти, чем HashSet, из-за поддержания связного списка.
  • Не допускает дубликатов, как и любой Set.

Когда использовать: Когда нужна коллекция без дубликатов, но при этом важен порядок, в котором элементы были добавлены (например, для реализации кэша с вытеснением по принципу FIFO).