一、思路
这个缓存算法使用一个计数器来记录条目被访问的频率。通过使用LFU缓存算法,最低访问数的条目首先被移除。这个方法并不经常使用,因为它无法对一个拥有最初高访问率之后长时间没有被访问的条目缓存负责
二、V1版本
/**
* put:
* 超出容器大小,移除最少访问元素
* <p>
* get:
* 取出元素,增加访问次数
*/
public class LFU {
int size;
PriorityQueue<Node> queue = new PriorityQueue<Node>(Comparator.comparingInt(e -> e.num));
HashMap<String, Node> map = new HashMap<>();
private class Node {
public Object data;
public int num;
public Node(Object data) {
this.data = data;
}
}
public LFU(int size) {
this.size = size;
}
public void put(Object data) {
String key = data.hashCode() + "";
if (map.containsKey(key)) {
Node node = map.get(key);
node.num++;
} else {
Node node= new Node(data);
map.put(key, node);
queue.offer(node);
}
if (queue.size() > this.size) {
Node node = queue.poll();
map.remove(node.data.hashCode()+ "");
}
}
public Object get(Object data) {
String key = data.hashCode() + "";
if (map.containsKey(key)) {
Node node = map.get(key);
node.num++;
return node.data;
}else{
return null;
}
}
}