//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()); }
测试结果