LRU即Least Recently Used的缩写,即最近最少使用,可以用来作为路由或者淘汰算法。
算法的思想是:如果一个数据在最近一段时间没有被访问到,那么在将来它被访问的可能性也很小。正是由于这个特性,所以我们可以将使用不到的数据淘汰。
基于链表的 LRU 实现 [头部是最新的数据(访问或者插入)]
思路:每次新插入数据的时候将新数据插到链表的头部;每次缓存命中(即数据被访问),则将数据移到链表头部;那么当链表满的时候,就将链表尾部的数据淘汰。
主要构成有get和put两个方法
get时将访问的数据放到头部(访问)
put时有两种情况
1.未达到最大容量,直接头部插入数据(插入)。
2.达到最大容量,则将末尾数据删除(淘汰最少使用),然后在头部插入数据(插入)。
public class LRUSimple {
private int cap = 0;
private LinkedList<User> link = new LinkedList<>();
LRUSimple(int capcity){
this.cap=capcity;
}
public User get(String user){
User u = null;
for(User tmp:link){
u=tmp;
if(tmp.getUser()==user){
//-------将数据移到头部----------
link.remove(tmp);
link.addFirst(tmp);
//------------------------------
}
}
return u;
}
public void put(User u){
if(link.size()==cap){//如果达到容量则将末尾数据删除(淘汰最少使用)
link.removeLast();
}
link.addFirst(u);//头部插入数据
}
public static void main(String[] args) {
// 测试
LRUSimple lru = new LRUSimple(3);
lru.put(new User("hzc","5"));
lru.put(new User("hc","5"));
lru.put(new User("h","5"));
lru.get("hzc");
lru.put(new User("h2c","5"));
System.out.println(lru.toString());
}
@Override
public String toString() {
return link.toString();
}
//---------------------实体类----------------------------
static class User{
private String user;
private String age;
public User(String user, String age) {
super();
this.user = user;
this.age = age;
}
public String getUser() {
return user;
}
public void setUser(String user) {
this.user = user;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
@Override
public String toString() {
return "User [user=" + user + ", age=" + age + "]";
}
}
}