import java.util.LinkedHashMap;
import java.util.Map;

public class Solution {
    private final LinkedHashMap<Integer, Integer> cache;

    public Solution(int capacity) {

        this.cache = new LinkedHashMap((int) (capacity / 0.75f + 2), 0.75f, true) {
            @Override
            protected boolean removeEldestEntry(Map.Entry eldest) {
                return this.size() > capacity;
            }
        };

    }

    public int get(int key) {
        Integer v = cache.get(key);

        return v == null ? -1 : v;
    }

    public void set(int key, int value) {
        cache.put(key, value);
    }
}

熟悉常用工具类LinkedHashMap的情况下,此题用java解题,应该是最方便的。

需要注意的细节如下:

①容量已知,因此创建LinkedHashMap实例的时候,就可以足量分配,避免容量扩展和重新hash。

②由于题目要求按照访问顺序排列缓存,因此需要设置LinkedHashMapaccessOrder布尔变量为true

③题目要求容量满则淘汰最久未使用的条目,因此需要覆写removeEldestEntry方法。此方法会在put方法插入完成的末尾调用,方法的具体作用名称已经体现——移除最老的条目。

(ps:阅读第三方缓存工具类的源码的时候,可以看到LinkedHashMap的更具体的使用方法。jdk8官方教程集合部分,也有说到LinkedHashMapremoveEldestEntry方法的用途。)