更新时间:2023-09-01 来源:黑马程序员 浏览量:
在Java中实现一个LRU(Least Recently Used)缓存可以使用泛型来灵活支持不同类型的数据。LRU缓存基于最近访问策略,当缓存达到一定大小时,会将最近最少使用的数据项从缓存中移除。
以下是一个使用泛型的简单LRU缓存的实现示例,我将逐步解释其核心部分。
import java.util.*; public class LRUCache<K, V> { private final int capacity; private final LinkedHashMap<K, V> cache; public LRUCache(int capacity) { this.capacity = capacity; this.cache = new LinkedHashMap<>(capacity, 0.75f, true) { @Override protected boolean removeEldestEntry(Map.Entry<K, V> eldest) { return size() > capacity; } }; } public V get(K key) { return cache.getOrDefault(key, null); } public void put(K key, V value) { cache.put(key, value); } public void display() { for (Map.Entry<K, V> entry : cache.entrySet()) { System.out.print("(" + entry.getKey() + ":" + entry.getValue() + ") "); } System.out.println(); } public static void main(String[] args) { LRUCache<String, Integer> cache = new LRUCache<>(3); cache.put("one", 1); cache.put("two", 2); cache.put("three", 3); System.out.println("Initial Cache:"); cache.display(); // Output: (one:1) (two:2) (three:3) cache.get("one"); // Access "one" to make it most recently used. System.out.println("Cache after accessing 'one':"); cache.display(); // Output: (two:2) (three:3) (one:1) cache.put("four", 4); // Adding a new item, which should remove the least recently used item ("two"). System.out.println("Cache after adding 'four':"); cache.display(); // Output: (three:3) (one:1) (four:4) } }
接下来笔者逐步解释上述代码:
1.LRUCache类是泛型类,它接受两个类型参数K和V,分别代表键和值的类型。
2.在构造函数中,我们传入缓存的容量(最大允许存储的键值对数)。我们使用LinkedHashMap来实现缓存,因为它可以保持插入顺序或访问顺序,我们选择访问顺序以实现LRU策略。
3.在构造LinkedHashMap时,我们通过传递参数来设置accessOrder为true,这会将访问过的元素移到链表尾部,以便我们能够轻松找到最近使用的元素。
4.我们还覆盖了removeEldestEntry方法,该方法会在添加新元素后被调用。我们在这里检查缓存的大小是否超过容量,如果超过容量,则移除最老的元素。这个方法决定了何时移除最不常使用的元素。
5.get方法允许获取缓存中的值,如果键不存在,则返回 null。
6.put方法用于向缓存中添加键值对。
7.display方法用于显示缓存的内容,用于调试和测试。
8.在main方法中,我们演示了如何创建一个LRUCache实例,并使用它来添加、获取和更新缓存中的元素。
以上示例演示了如何使用泛型编写一个LRU缓存。我们可以根据自己的需求对其进行扩展和定制。