LRU(最近最少使用)缓存是一种经典的缓存算法,它根据数据最近被访问的时间来决定哪些数据应该被保留在缓存中,哪些数据应该被替换掉。在 Java 中实现 LRU 缓存,可以使用 LinkedHashMap 来实现。
LinkedHashMap 是一种哈希表和双向链表的混合数据结构,它可以保持插入顺序或访问顺序,通过设置 accessOrder 参数为 true,可以使 LinkedHashMap 以访问顺序维护数据,这样可以很方便地实现 LRU 缓存。
以下是一个简单的 LRU 缓存实现:
import java.util.LinkedHashMap;
import java.util.Map;
public class LRUCache<K, V> extends LinkedHashMap<K, V> {
private int capacity;
public LRUCache(int capacity) {
super(capacity, 0.75f, true);
this.capacity = capacity;
}
@Override
protected boolean removeEldestEntry(Map.Entry<K, V> eldest) {
return size() > capacity;
}
}
这里定义了一个 LRUCache 类,它继承自 LinkedHashMap,并重写了 removeEldestEntry 方法。这个方法会在添加新元素时被调用,如果缓存的大小超过了容量,就会删除最老的元素,保持缓存的大小不超过容量。
可以通过以下方式使用 LRUCache:
LRUCache<Integer, String> cache = new LRUCache<>(2);
cache.put(1, "one");
cache.put(2, "two");
cache.get(1); // 返回 "one"
cache.put(3, "three");
cache.get(2); // 返回 null
这个例子中,LRUCache 的容量是 2,先添加了键值对 (1, "one") 和 (2, "two"),然后访问了键 1,接着又添加了键值对 (3, "three"),此时缓存已满,因此会删除最老的元素 (2, "two")。最后再次访问键 2,由于已经被删除,会返回 null。