Sobes.tech
Senior

Améliorez l'implémentation du cache LRU pour que l'éviction se fasse selon le temps du dernier accès, et non selon le temps d'ajout.

sobes.tech IA

Réponse de l'IA

Чтобы реализовать LRU-кэш, где вытеснение происходит по времени последнего обращения, а не по времени добавления, можно использовать связку LinkedHashMap с доступом по порядку доступа (accessOrder=true) в Java.

Пример реализации LRU-кэша с вытеснением по последнему обращению:

import java.util.LinkedHashMap;
import java.util.Map;

public class LRUCache<K, V> extends LinkedHashMap<K, V> {
    private final int capacity;

    public LRUCache(int capacity) {
        // true для порядка доступа, false - порядок вставки
        super(capacity, 0.75f, true);
        this.capacity = capacity;
    }

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

    public static void main(String[] args) {
        LRUCache<Integer, String> cache = new LRUCache<>(3);
        cache.put(1, "one");
        cache.put(2, "two");
        cache.put(3, "three");
        cache.get(1); // обращение к ключу 1
        cache.put(4, "four"); // вытеснится ключ 2, так как он был наименее недавно использован

        System.out.println(cache.keySet()); // Выведет [3, 1, 4]
    }
}

В этом примере:

  • LinkedHashMap с параметром accessOrder=true поддерживает порядок элементов по времени последнего доступа.
  • Метод removeEldestEntry вызывается после вставки нового элемента и удаляет самый старый по времени доступа элемент, если размер превышает емкость.

Таким образом, вытеснение происходит по времени последнего обращения, а не по времени добавления.