用java精简的实现LRU
作者:互联网
- 设计一个Page类模拟内存(int pageID,String content),因为content是变的,所以只使用pageId来进行equals和hash。
- 设计一个LRUCollection类的要点:核心接口是get(pageId),get的设计要点其实就是要使用什么样的数据结构的问题,下面分析需求来决定使用什么样的数据结构。
- 必须要能根据这个id拿到相应的page,可以使用数组可以使用hashMap。而且这个id的取值可能不是0-n,因为在某一个时刻LRUCollection可能存在1,3,5三个page,那么怎样将pageId对应到数组角标呢?所以只能使用HashMap
- 当访问一个page时,要能将相应的Page放到集合的最前面以表示最近访问过。所以不仅要使用HashMap还得是LinkedHashMap。但是LinkedHashMap的遍历顺序是插入顺序,不是访问顺序,需要将accessOrder参数设置为true,变为访问顺序。
代码
package neu.lab.practice.base;
import java.util.*;
public class LRUCollection {
public static void main(String[] args) {
LRUCollection lru = new LRUCollection();
String[] visits = {"1","2","3","4","1","2","5","1","2","3","4","5"};
for(String visit:visits) {
lru.get(visit);
}
System.out.println(lru.cnt);
}
private LRULinkedHashMap pages = new LRULinkedHashMap(3);
private int cnt = 0;//记录缺页次数
public Page get(String pageId) {
Page p = pages.get(pageId);
if(p==null) {
cnt++;
//此处的逻辑并不能统一,此处对应Page不存在的逻辑。如果是系统缺页则需要从硬盘中调出相应的页。
//TODO
p = new Page(pageId,"");
pages.put(pageId, p);
}
return p;
}
public static class LRULinkedHashMap extends LinkedHashMap<String,Page> {
private int capacity;
public LRULinkedHashMap(int capacity) {
//最后一个参数设置为true很重要!!!
super(16, 0.75f, true);
this.capacity = capacity;
}
@Override
public boolean removeEldestEntry(Map.Entry<String,Page> eldest) {
return size() > capacity;
}
}
public static class Page {
String id;
String content;
public Page(String id, String content) {
super();
this.id = id;
this.content = content;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((id == null) ? 0 : id.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Page other = (Page) obj;
if (id == null) {
if (other.id != null)
return false;
} else if (!id.equals(other.id))
return false;
return true;
}
}
}
代码中的测试案例来源
https://www.cnblogs.com/RB26DETT/p/10035804.html
参考
https://www.cnblogs.com/keeya/p/9602691.html
https://www.cnblogs.com/zlting/p/10775887.html
标签:pageId,java,String,id,public,LRU,精简,return,Page 来源: https://blog.csdn.net/btb0815/article/details/96702196