New We are sorting MAX channels into categories and territories. Read the news

Простой LRU-кеш в Java без дополнительных библиотек


LRU удаляет запись, к которой дольше всего не обращались. Для небольшого кеша достаточно LinkedHashMap:
import java.util.LinkedHashMap;
import java.util.Map;

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

LruCache(int capacity) {
super(16, 0.75f, true);
if (capacity <= 0) {
throw new IllegalArgumentException(
"capacity must be positive"
);
}
this.capacity = capacity;
}

@Override
protected boolean removeEldestEntry(
Map.Entry<K, V> eldest) {
return size() > capacity;
}
}
Третий аргумент true включает порядок по обращениям: успешный get() переносит запись в конец. После добавления новой записи removeEldestEntry() позволяет удалить первую, если лимит превышен.
var cache = new LruCache<String, Integer>(2);

cache.put("A", 1);
cache.put("B", 2);
cache.get("A"); // Теперь B использовали давнее
cache.put("C", 3); // Удалится B

System.out.println(cache.keySet()); // [A, C]
Лимит задаётся числом записей, а не объёмом памяти. TTL здесь нет, и кеш не потокобезопасен. Более того, даже get() может менять внутренний порядок, поэтому параллельные чтения тоже требуют синхронизации.
Views: 67
Open in MAX Report an inaccuracy

Report an inaccuracy

Describe what needs fixing. If you have a source, add a link.

You are leaving datool.ru

The link leads to an external website. datool.ru is not responsible for its content — check the address before entering passwords or payment details.

Redirecting in 10 s

Go