Что такое LinkedHashSet в Java?

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

Ответ

LinkedHashSet<E> — это реализация интерфейса Set, которая:

  1. Гарантирует уникальность элементов (как HashSet).
  2. Сохраняет порядок вставки элементов (как LinkedList).

Внутреннее устройство: LinkedHashSet наследуется от HashSet и внутри использует HashMap для хранения элементов. Однако он дополняет его двусвязным списком, который проходит через все записи и поддерживает порядок их добавления.

Пример и сравнение:

Set<String> hashSet = new HashSet<>();
Set<String> linkedHashSet = new LinkedHashSet<>();

for (String s : Arrays.asList("B", "A", "D", "C", "A")) {
    hashSet.add(s);
    linkedHashSet.add(s);
}

System.out.println("HashSet:      " + hashSet);      // Порядок непредсказуем, например [A, B, C, D]
System.out.println("LinkedHashSet:" + linkedHashSet); // Гарантированно [B, A, D, C]

Производительность:

  • Немного медленнее HashSet из-за накладных расходов на поддержание связного списка.
  • Быстрее TreeSet для операций добавления и поиска, так как не требует поддержания порядка сортировки.

Использование: Выбирайте LinkedHashSet, когда вам нужен Set (уникальные элементы), но при этом важен порядок, в котором вы их добавляли (например, для кэширования с политикой FIFO).