Какой порядок элементов поддерживает LinkedHashMap в Java?

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

Ответ

LinkedHashMap сохраняет порядок итерации по элементам, который по умолчанию соответствует порядку вставки (insertion-order).

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

  1. Порядок вставки: Элементы перебираются в том порядке, в котором они были добавлены в карту.
  2. Порядок доступа (LRU-подобный): При создании с флагом accessOrder = true порядок итерации меняется при каждом обращении (get, put). Последний использованный элемент перемещается в конец.
  3. Реализация: Расширяет HashMap, добавляя двусвязный список для поддержания порядка.

Пример 1: Порядок вставки (по умолчанию)

Map<String, Integer> map = new LinkedHashMap<>();
map.put("z", 1);
map.put("a", 2);
map.put("m", 3);

for (String key : map.keySet()) {
    System.out.print(key + " "); // Вывод: z a m
}

Пример 2: Порядок доступа (LRU)

// Третий параметр `true` включает режим порядка доступа
Map<String, Integer> lruMap = new LinkedHashMap<>(16, 0.75f, true);
lruMap.put("a", 1);
lruMap.put("b", 2);
lruMap.put("c", 3);

lruMap.get("a"); // Обращение к "a" перемещает её в конец

for (String key : lruMap.keySet()) {
    System.out.print(key + " "); // Вывод: b c a
}

Это поведение полезно для создания простых LRU-кэшей (Least Recently Used).