//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());
}

测试结果
图片说明