LRU算法:最近最少使用算法
核心思想:淘汰掉最近访问次数最少的字块
举一个例子:假设缓存有4个字块
1 2 3 4 此时该四个字块被访问并加载到缓存中,假设此时,cpu第二次访问,访问到3这个字块,LRU算法会把3这个字块置换到序列的最前面,此时,序列顺序变成 3 1 2 4,假设此时,cpu第三次访问,访问了内存当中的第5个字块,但缓存中没有该字块,LRU算法会将该字块加载到缓存,但此时缓存序列已经满了,所以LRU算法则首先会将缓存中最后一个字块(也就是4)淘汰掉,并将第五个字块加到缓存序列的最前面,此时序列变成:5 3 1 2
由于本文重点偏向实现该算法,所以不进行过多理论解释,由于使用的是自定义的链表类,所以代码会有些多,阅读性有所欠缺,但我在核心代码的方法加了必要的说明,建议可以重点看下appendHead方法的实现。
实现代码
1.自定义双向链表类
public class DoubleLinkedQueue<K,V> {
//内部封装Node类,成员变量:键值对(key,value),指向上一个节点的引用(pre),指向下一个节点的引用(next)
private class Node
{
private K key;
private V value;
private Node pre,next;
//内部类构造方法
public Node( K key,V value) {
this.key=key;
this.value=value;
this.pre=null;
this.next=null;
}
@Override
//链表节点的打印方法
public String toString() {
return "Node [key=" + key + ", value=" + value + "]";
}
}
//head记录双向链表的头节点
private Node head;
tail记录双向链表的尾节点