用LinkedHashMap实现FIFO和LRU
//FIFO
public class FIFOCache<K,V> extends LinkedHashMap<K, V> {
private final int SIZE;
public FIFOCache(int size) {
super();
SIZE = size;
}
/**
* 重写淘汰机制
* @param eldest
* @return
*/
@Override
protected boolean removeEldestEntry(Map.Entry<K, V> eldest) {
//如果缓存存储达到最大值删除最后一个
return size() > SIZE;
}
}
//测试
public static void main(String[] args) {
//设置容量为10
FIFOCache<Integer, Integer> map = new FIFOCache<Integer, Integer>(5);
//放入5个数据
for (int i = 0; i++ < 5;) {
map.put(i, i);
}
//打印起始存储情况
System.out.println("起始存储情况:"+map.toString());
//存入一个已存在的数据,也就是命中一次缓存中的数据
map.put(2, 2);
//打印命中之后的情况
System.out.println("命中一个已存在的数据:"+map.toString());
//又存入缓存之外的数据
map.put(6, 6);
//打印又存储一个数据之后的情况
System.out.println("新增一个数据后:"+map.toString());
}测试结果
//LRU
public class LRUCache<K,V> extends LinkedHashMap<K, V> {
private final int SIZE;
public LRUCache(int size) {
/** int initialCapacity, float loadFactor, boolean accessOrder
* 这3个分别表示容量,加载因子和是否启用LRU规则
*/
super(size, 0.75f, true);
SIZE = size;
}
@Override
protected boolean removeEldestEntry(java.util.Map.Entry<K, V> eldest) {
return size() > SIZE;
}
}
//测试
public static void main(String[] args) {
LRUCache<Integer, Integer> map = new LRUCache<Integer, Integer>(5);
//放入5个数据
for (int i = 0; i++ < 5; ) {
map.put(i, i);
}
//打印起始存储情况
System.out.println("起始存储情况:"+map.toString());
map.get(3);
//打印命中之后的情况
System.out.println("命中一个已存在的数据:"+map.toString());
//存入一个已存在的数据,也就是命中一次缓存中的数据
map.put(5, 6);
//打印命中之后的情况
System.out.println("覆盖一个已存在的数据:"+map.toString());
//又存入缓存之外的数据
map.put(6, 6);
//打印又存储一个数据之后的情况
System.out.println("新增一个数据后:"+map.toString());
}测试结果
查看2道真题和解析
