概述
LRU是Least Recently Used的缩写,即最近最少使用算法。
通俗来讲就是没被调用的往后靠,被调用的往前靠,位置不够的时候就淘汰最后一个。
LinkedHashMap实现
java实现可以通过重写LinkedHashMap的removeEldestEntry方法来实现淘汰机制。
import java.util.LinkedHashMap;
import java.util.Map;
/**
* @Author JQiang
* @create 2021/4/6 17:41
*/
public class LRULinkedHashMap{
public static void main(String[] args){
LinkedHashMap<Integer,Integer> list = new LinkedHashMap<Integer,Integer>(5,0.75f,true){
@Override
protected boolean removeEldestEntry(Map.Entry<Integer, Integer> eldest) {
return size() > 5;
}
};
list.put(1,1);
list.put(2,2);
list.put(3,3);
list.put(4,4);
list.put(5,5);
list.put(6,6);
list.put(7,7);
list.get(4);
for (Map.Entry<Integer, Integer> e :
list.entrySet()) {
System.out.println(e.getKey());
}
}
}
这里对removeEldestEntry的重写,意思是如果list里的 大小超过了我预设的值5就会把先插入而且没被调用的删掉。
构造器里主要介绍一下accessOrder参数,注释里解释到false是基于插入顺序,true是基于访问顺序排序,我们get一个元素后,这个元素会被加到最后,实现了LRU的最近最少被使用的调度算法。
剩下的参数一个是容量大小和加载因子。
上面程序运行结果:
3
5
6
7
4
容量为5,当插入6、7时,会执行removeEldestEntry方法,将之前的1、2删除,然后调用了get方法,把4的位置调到了最新的位置上。
List实现
list实现的就很简单了,很多功能和逻辑都很差,不过基本实现了LRU的思想。
import java.util.LinkedList;
import java.util.List;
/**
* @Author JQiang
* @create 2021/4/6 16:57
*/
public class LRULinkdList {
static int maxSize = 5;
public static void main(String[] args){
List<Integer> list = new LinkedList<>();
insert(list,1);
insert(list,2);
insert(list,3);
insert(list,4);
insert(list,5);
get(3,list);
// insert(list,maxSize,7);
for (Integer i :
list) {
System.out.println(i);
}
}
public static void insert(List<Integer> list,int num){
if (maxSize != list.size()){
list.add(num);
}else if (list.contains(num)){
list.remove(list.indexOf(num));
list.add(num);
}else {
list.remove(0);
list.add(num);
}
}
public static int get(int num,List<Integer> list){
for (Integer integer:
list) {
if (integer == num){
boolean remove = list.remove(integer);
insert(list,num);
return num;
}
}
return -1;
}
}