Вопрос с собеседования · Java

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

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

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

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

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

Подробно

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

После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.

Разбор собеседования