一、算法实现
import java.util.HashMap;
/**
* LRU(Least Recently Used):最近最少使用
* 核心思想:最近被访问的数据将来被访问的概率很大——FIFO思想的运用
* 算法描述:(队列越靠近顶部数据越陈旧)
* 1、缓存有余时:将数据直接放到队列底部
* 2、缓存用完时:
* 1)当缓存中存在待访问的数据时,将该数据移到缓存底部
* 2)当缓存中不存在待访问的数据时,将队列顶部的数据移出,并将新数据插入到队列底部
* <p>
* 使用HashMap + 双向链队列实现LRU算法
* 1、HashMap用来存储具体的缓存数据
* 2、双向链表将HashMap中的数据以访问的时间顺序链接起来
*
* @author happy
* @date 2019/11/21
*/
public class LruCache {
/**
* 缓存容量
*/
private int capacity;
/**
* 以使用的缓存指针
*/
private int used = 0;
private HashMap<String, DLinkedNode> cache;
/**
* 双向队列的头尾指针
*/
private DLinkedNode head, tail;
public LruCache(int capacity) {
this.capacity = capacity;
cache = new HashMap<>(capacity);
head = new DLinkedNode();
tail = new DLinkedNode();
// 初始化双向队列为空
head.pre = null;
head.next = tail;
tail.pre = head;
tail.next = null;
}
/**
* 将数据添加到缓存中
*
* @param key 待缓存数据的键
* @param v