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