Назад к вопросам
Совкомбанк
Senior
6
Реализуй LRU-кэш с вытеснением старых значений (базовая реализация)
Компании, где спрашивали
Ответ от нейросети
sobes.tech AI
Для реализации LRU-кэша в Java часто используют комбинацию LinkedHashMap с переопределением метода removeEldestEntry, что позволяет автоматически удалять самый старый элемент при достижении лимита.
Пример базовой реализации LRU-кэша на Java:
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) {
super(capacity, 0.75f, true); // 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 автоматически удаляет самый старый элемент при превышении размера.
- При вызове get элемент становится "новым" в порядке доступа.
Это простое и эффективное решение для LRU-кэша в Java.