什么是LRU算法?
什么是LRU算法? LRU是Least Recently Used的缩写,即最近最久未使用,常用于页面置换算法,是为虚拟页式存储管理服务的。
LinkedHashMap实现LRU算法实例:
Map<String,Integer> map1 = new LinkedHashMap<String,Integer>(
5, // 初始容量
0.75f, //加载因子
true); //使用排序算法
map1.put("A", 100);
map1.put("B", 200);
map1.put("C", 300);
map1.put("D", 400);
map1.put("E", 500);
//初始顺序
System.out.println(map1);//{A=100, B=200, C=300, D=400, E=500}
//当我操作里面的元素后
map1.get("B");
System.out.println(map1);//{A=100, C=300, D=400, E=500, B=200}
//会发现 操作过的元素都跑到了最后面
下面我不用LinkedHashMap 来实现,主要思路是:用LinkedList集合来实现,每操作一个元素,就把该元素删除,然后放于集合的最后面
public class LRUDemo {
List<Object> list; //存储元素 也就是 value
List<Object> index ; //计算元素的序号 也存 key 值
//要时刻保持 key-vlaue 两个集合的下标一致
/**
* 在构造方法里初始化 两个集合
*/
public LRUDemo(){
list = new LinkedList<Object>();
index = new LinkedList<Object>();
}
//增 改
public boolean add(String key,String value){
boolean flag = index.contains(key); //判断key值集合里是否有这个元素
if(!flag){//如果key值集合里没有这个元素
index.add(key); //将 传进来的 key 值存储到 key值集合的最后
list.add(value);将 传进来的 value 值存储到 value值集合的最后
return true;
}else{//如果key值集合里 有这个元素
int a = index.indexOf(key); //先获取这个元素在key值集合中的下标
list.remove(a); //先在 value 集合中移除 对应下标的元素
list.add(value); //然后将传进来的value值 存到 value集合的最后
index.remove(key);
index.add(key);
return true;
}
}
//查
public Object get(String key){
boolean flag = index.contains(key);
if(flag){
int a =index.indexOf(key);
Object o = list.remove(a);
list.add(o);
index.remove(key);
index.add(key);
return o;
}
return null;
}
//删
public boolean remove(String key){
boolean flag = index.contains(key);
if(flag){
int a = index.indexOf(key);
list.remove(a);
index.remove(key);
return true;
}else{
return false;
}
}
@Override
public String toString() {
String all="{";
for (int i = 0; i <index.size(); i++) {
all=all+index.get(i)+":"+list.get(i)+",";
}
all = all.substring(0,all.lastIndexOf(","))+"}";
return all;
}
public static void main(String[] args) {
LRUDemo map = new LRUDemo;
map.add("A", "100");
map.add("B", "200");
map.add("C", "300");
map.add("D", "400");
System.out.println(map);//{A:100,B:200,C:300,D:400}
map.add("C","500");
System.out.println(map); //{A:100,B:200,D:400,C:500}
map.get("B");
System.out.println(map);//{A:100,D:400,C:500,B:200}
}
}