【450、实现 LRU cache】

66 阅读1分钟

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。