LRU简单介绍
LRU(Least Recently Used)是一种常见的页面置换算法,在计算中,所有的文件操作都要放在内存中进行,然而计算机内存大小是固定的,所以我们不可能把所有的文件都加载到内存,因此我们需要制定一种策略对加入到内存中的文件进项选择。
实现思虑
1、数据需要保存,可以使用ConcurrentHashMap
2、需要记录数据的先后关系,常见的保存方式可以是数组、链表,但是使用数组则不方便修改数据保存的位置。大部分同学都应该会刷面试题,arrayList 和 LinkedList 的区别,应该都清楚,LinkedList在数据的增删方面具有极大的优势。但是此处我们更适合双向链表,默认拥有头、尾部节点。
3、rul算法需要一个限定储存数据的长度
java代码实现
LRUCache.java
public class LRUCache<V> {
private int capacity = 1024;
private Map<String,MyNode<String,V>> map = new ConcurrentHashMap<>();
private MyNode head;
private MyNode tail;
public LRUCache(){
this.head = new MyNode();
this.tail = new MyNode();
this.head.nextNode = tail;
this.tail.preNode = head;
}
//为方便测试以及动态控制容量
public LRUCache(int capacity){
this.head = new MyNode();
this.tail = new MyNode();
this.capacity = capacity;
this.head.nextNode = tail;
this.tail.preNode = head;
}
//
public V get(String key){
MyNode<String,V> curNode = map.get(key);
if(curNode==null){
return null;
}else if(curNode==head.nextNode){
//获取数据就是头部最新 数据,无需处理
return curNode.val;
}
//1 headNext 指向curNode.next
MyNode<String,V> headNext = head.nextNode;
headNext.nextNode = curNode.nextNode;
curNode.nextNode.preNode = headNext.nextNode;
//2 head.next 指向curNode
curNode