Sobes.tech
Senior

Беҳтарсозии иҷрои кеши LRU барои он ки хориҷ кардан дар асоси вақти охирини дастрасӣ бошад, на дар асоси вақти илова кардан.

sobes.tech AI

Ҷавоб аз AI

Чтобы реализовать 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 вызывается после вставки нового элемента и удаляет самый старый по времени доступа элемент, если размер превышает емкость.

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