10行Java代码实现最近被使用(LRU)缓存

最近最少使用缓存的回收 

为了实现缓存回收,我们需要很容易做到: 

 

  • 查询出最近最晚使用的项
  • 给最近使用的项做一个标记


链表可以实现这两个操作。检测最近最少使用的项只需要返回链表的尾部。标记一项为最近使用的项只需要从当前位置移除,然后将该项放置到头部。比较困难的事情是怎么快速的在链表中找到该项。 

哈希表的帮助 

看一下我们工具箱中的数据结构,哈希表可以在(消耗)常量的时间内索引到某个对象。如果我们创建一个形如key->链表节点的哈希表,我们就能够在常量时间内找到最近使用的节点。更甚的是,我们也能够在常量时间内判断节点的是否存在(或不存在); 

找到这个节点后,我们就能将这个节点移动到链表的最前端,标记为最近使用的项了。 

Java的捷径 

据我所知,很少有一种编程语言的标准库中有通用的数据结构能提供上述功能的。这是一种混合的数据结构,我们需要在哈希表的基础上建立一个链表。但是Java已经为我们提供了这种形式的数据结构-LinkedHashMap!它甚至提供可覆盖回收策略的方法(见removeEldestEntry文档)。唯一需要我们注意的事情是,改链表的顺序是插入的顺序,而不是访问的顺序。但是,有一个构造函数提供了一个选项,可以使用访问的顺序(见文档)。 

无需多说: 

 

 

Java代码 

  1. import java.util.LinkedHashMap;  
  2. import java.util.Map;  
  3.    
  4. public LRUCache<K, V> extends LinkedHashMap<K, V> {  
  5.   private int cacheSize;  
  6.    
  7.   public LRUCache(int cacheSize) {  
  8.     super(160.75true);  
  9.     this.cacheSize = cacheSize;  
  10.   }  
  11.    
  12.   protected boolean removeEldestEntry(Map.Entry<K, V> eldest) {  
  13.     return size() >= cacheSize;  
  14.   }  
  15. }  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值