不用LinkedHashMap实现 LRU算法

什么是LRU算法? 

什么是LRU算法? LRU是Least Recently Used的缩写,即最近最久未使用,常用于页面置换算法,是为虚拟页式存储管理服务的。

LinkedHashMap实现LRU算法实例:

 Map  map1 = new LinkedHashMap(
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  list;  //存储元素                   也就是 value
List index ;  //计算元素的序号      也存 key 值
//要时刻保持  key-vlaue  两个集合的下标一致
/**
* 在构造方法里初始化 两个集合
*/
public LRUDemo(){
list = new LinkedList();
index = new LinkedList();
}
//增  改
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 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}
}
}


你可能感兴趣的:(不用LinkedHashMap实现 LRU算法)