Назад к вопросам
Совкомбанк
Senior
4
Доработай реализацию LRU-кэша так, чтобы вытеснение происходило по времени последнего обращения, а не по времени добавления
Компании, где спрашивали
Ответ от нейросети
sobes.tech 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вызывается после вставки нового элемента и удаляет самый старый по времени доступа элемент, если размер превышает емкость.
Таким образом, вытеснение происходит по времени последнего обращения, а не по времени добавления.