当前位置:   article > 正文

LinkedList 实现 LRU 缓存

LinkedList 实现 LRU 缓存

LRU(Least Recently Used,最近最少使用)缓存是一种缓存淘汰策略,用于在缓存满时淘汰最久未使用的元素。

关键:

缓存选什么结构?

怎么实现访问顺序?

  1. import java.util.*;
  2. public class LRUCache<K, V> {
  3. private final int capacity; // 缓存容量
  4. private final Map<K, V> cache; // 用于存储缓存数据
  5. private final LinkedList<K> order; // 用于维护访问顺序
  6. public LRUCache(int capacity) {
  7. this.capacity = capacity;
  8. this.cache = new HashMap<>(capacity);
  9. this.order = new LinkedList<>();
  10. }
  11. public V get(K key) {
  12. if (!cache.containsKey(key)) {
  13. return null; // 如果缓存中不存在该键,返回 null
  14. }
  15. // 将访问的键移到队列的尾部,表示最近使用
  16. order.remove(key);
  17. order.addLast(key);
  18. return cache.get(key);
  19. }
  20. public void put(K key, V value) {
  21. if (cache.containsKey(key)) {
  22. // 如果缓存中已经存在该键,更新值并将键移到队列的尾部
  23. cache.put(key, value);
  24. order.remove(key);
  25. order.addLast(key);
  26. } else {
  27. if (cache.size() >= capacity) {
  28. // 如果缓存满了,移除最久未使用的键
  29. K oldestKey = order.removeFirst();
  30. cache.remove(oldestKey);
  31. }
  32. // 添加新键值对到缓存
  33. cache.put(key, value);
  34. order.addLast(key);
  35. }
  36. }
  37. public static void main(String[] args) {
  38. LRUCache<String, String> lruCache = new LRUCache<>(3);
  39. lruCache.put("1", "one");
  40. lruCache.put("2", "two");
  41. lruCache.put("3", "three");
  42. System.out.println(lruCache.get("1")); // 输出: one
  43. lruCache.put("4", "four");
  44. System.out.println(lruCache.get("2")); // 输出: null (因为2是最久未使用的)
  45. }
  46. }

 测试讲解:

先定义了大小为3的缓存,然后存1,2,3,此时的访问顺序1-2-3,list头部是最早访问的,尾部是最晚访问的,此时缓存已满,然后访问了1,则现在的顺序是2-3-1,可见,2是那个最久没被访问的,我再添加新元素4时,需要删除的是2,顺序变成3-1-4。

        

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小惠珠哦/article/detail/897284
推荐阅读
相关标签
  

闽ICP备14008679号