不用LinkedHashMap实现 LRU算法

本文介绍了LRU(最近最久未使用)算法,并展示了如何不依赖LinkedHashMap,而是通过LinkedList来实现LRU。首先解释了LRU算法的基本概念,接着展示了一个使用LinkedList和辅助索引列表的LRUDemo类,该类实现了添加、获取和删除操作,确保最近操作的元素始终位于列表末尾。
摘要由CSDN通过智能技术生成

什么是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}
}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值