该算法按照LRU(最近最少使用的)原则清除页面。这意味着该算法将驱逐最近的请求最早的页面。我们假设初始缓存内容是一个接一个地添加的,首先是20,然后是30,然后是10。命中和脱靶序列将是2h4m。hm也是每次要叠加的,见下面的结果图的输出模样
输出是最底下的那个
public class LRUCache{
private int maxSize;
/**
*/
private ConcurrentHashMap map = new ConcurrentHashMap<>();
/**
**存储缓存key列表
*/
private LinkedList list;
LRUCache(){
}
LRUCache(int maxSize){
this.maxSize = maxSize;
this.list = new LinkedList<>(maxSize);
}
/**
@return 缓存值
*/
synchronized Object getVal(String key){
//1.从map里取数据
Object obj = map.get(key);
//2.将key置于list的尾部(表示最近被访问过了)
if(obj != null){
addOrRefreshKey(key);
}
}
synchronized void putVal(String key,Object val){
//1.设置val到map中
//2.将key置于list的尾部(表示最近被访问过了)
//3.需要做判断是否list.size()>maxSize。如果满了就删除头部(最近最少使用)的数据后再执行1-2步骤
}
/**
*/
private void addOrRefreshKey(String key){
this.list.remove(key); //管他三七二十一,先删除掉
this.list.add(key); //然后添加这个可以,保证key置于list的尾部
}
}
继承 LinkedHashMap类,重写 removeEldestEntry()方法 即可
这个问题你昨天是不是开过新的提问?
https://ask.csdn.net/questions/7656255
import java.util.LinkedHashMap;
import java.util.Map;
public class LRUCache<K, V> extends LinkedHashMap<K, V> {
private int cap;
private static final long serialVersionUID = 1L;
public LRUCache(int cap) {
super(16, 0.75f, true);
this.cap = cap;
}
@Override
protected boolean removeEldestEntry(Map.Entry<K, V> eldest) {
return size() > cap;
}
}