Gymterview
middle

Как, используя LinkedHashMap, сделать кэш с invalidation policy

Для создания LRU-кэша (Least Recently Used) нужно использовать LinkedHashMap с режимом access-order и переопределить метод removeEldestEntry().

Пример
public class LRUCache<K, V> extends LinkedHashMap<K, V> {
    private final int maxSize;

    public LRUCache(int maxSize) {
        super(maxSize, 0.75f, true); // true = access-order
        this.maxSize = maxSize;
    }

    @Override
    protected boolean removeEldestEntry(Map.Entry<K, V> eldest) {
        return size() > maxSize;
    }
}

Как это работает:

  • Параметр accessOrder = true в конструкторе включает режим, при котором каждое обращение к элементу (get(), put()) перемещает его в конец списка.
  • Наименее используемые элементы группируются в начале списка.
  • removeEldestEntry() вызывается после каждого put()/putAll() и, если возвращает true, удаляет самый старый элемент (eldest — первый в списке).

Ограничение: при вставке элемента с уже существующим ключом порядок итерации не изменяется в режиме insertion-order, но изменяется в access-order. Для production-кода лучше использовать Caffeine или Guava Cache, которые поддерживают TTL, размерные ограничения и метрики.

На собеседовании: покажите код LRU-кэша на LinkedHashMap. Объясните три ключевых момента: accessOrder = true, removeEldestEntry() и ограничения подхода.