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() и ограничения подхода.