Получить доступ

Что LinkedHashMap добавляет к обычной HashMap?

JuniorКоллекции
Ещё спрашивают так:
  • Как сделать LRU-кэш в Java?
  • Чем LinkedHashMap отличается от HashMap и TreeMap?
Коротко

Предсказуемый порядок обхода — по умолчанию в порядке вставки — поверх той же хеш-таблицы.

  • Порядок держит двусвязный список через все записи: скорость та же, памяти чуть больше
  • Режим accessOrder — порядок по обращению; с removeEldestEntry получается LRU-кэш

А ещё Сортировка по ключу — это TreeMap, а не LinkedHashMap

Так подсказку видит пользователь sotto на живом собеседовании — за пару секунд, пока вы думаете вслух.

Подробно

LinkedHashMap наследует HashMap и дополнительно связывает все записи двусвязным списком. Поэтому:

  • доступ по ключу — те же O(1) в среднем;
  • обход идёт в предсказуемом порядке — по умолчанию в порядке вставки (повторный put существующего ключа порядок не меняет);
  • цена — две дополнительные ссылки на запись.

Режим порядка доступа. Конструктор LinkedHashMap(capacity, loadFactor, true) включает порядок по обращению: каждый get или put перемещает запись в конец. Если переопределить removeEldestEntry, получится кэш, вытесняющий давно не использованные записи (LRU), — частая задача на собеседовании.

Когда что выбирать: только быстрый доступ — HashMap; нужен порядок вставки (например, сохранить порядок полей JSON) — LinkedHashMap; нужна сортировка по ключу и диапазоны — TreeMap.

Пример

class LruCache<K, V> extends LinkedHashMap<K, V> {
    private final int capacity;
    LruCache(int capacity) {
        super(16, 0.75f, true);          // порядок по обращению
        this.capacity = capacity;
    }
    @Override
    protected boolean removeEldestEntry(Map.Entry<K, V> eldest) {
        return size() > capacity;
    }
}

Что хотят услышать

  • Предсказуемый порядок обхода, по умолчанию — вставки.
  • Как это устроено: двусвязный список поверх хеш-таблицы.
  • Режим accessOrder и LRU-кэш — плюс.
  • Отличие от TreeMap.

Частые ошибки

  • Путать порядок добавления с сортировкой по ключу.
  • Считать эту реализацию потокобезопасной.

Проверьте себя

Один верный вариант. Подумайте, потом откройте ответ.

Показать варианты и ответ
  • ✓Предсказуемый порядок обхода — по умолчанию в порядке добавления элементов
  • ✗Сортировку элементов по значению ключа
  • ✗Потокобезопасность при доступе из нескольких потоков
  • ✗Возможность хранить несколько значений по одному ключу

Что спросят дальше

  • Как на её основе делают LRU-кэш?
  • Чем она отличается от реализации на дереве?

Разбор темы

Связанные вопросы

Закрытая бета

Подсказки на собеседовании — в реальном времени

sotto слышит вопрос интервьюера и показывает короткий ответ и план, как в блоке «Коротко». Оставьте контакт — пришлём доступ и промокод.

  • Промокод на 2 часа — сверх пробных 30 минут
  • Программа для Windows — скачать сразу, войти — через Яндекс ID или VK ID
  • Прямая связь с разработчиком: что улучшить — сделаем