Новое Распределяем каналы MAX по категориям и территориям. Читать новость

Простой 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() может менять внутренний порядок, поэтому параллельные чтения тоже требуют синхронизации.
Просмотры: 67
Открыть в MAX Сообщить о неточности

Сообщить о неточности

Опишите, что нужно исправить. Если есть источник, добавьте ссылку.

Вы покидаете datool.ru

Ссылка ведёт на внешний сайт. datool.ru не отвечает за его содержимое — проверьте адрес, прежде чем вводить пароли или платёжные данные.

Переход через 10 с

Перейти