题目描述:
    image.png
    image.png
    解析:方法一:重写LinkedHashMap 方法二:自己用链表实现

    1. //方法一:
    2. class LRUCache {
    3. //创建一个LinkedHashMap
    4. private LinkedHashMap<Integer,Integer> map;
    5. public LRUCache(int capacity) {
    6. map=new LinkedHashMap<Integer,Integer>(capacity,0.75f,true){
    7. @Override
    8. protected boolean removeEldestEntry(Map.Entry<Integer, Integer> eldest) {
    9. return size() > capacity; //当大小超过容量了,就移除该map中最老的键和值
    10. }
    11. };
    12. }
    13. public int get(int key) {
    14. return map.getOrDefault(key,-1);
    15. }
    16. public void put(int key, int value) {
    17. map.put(key,value);
    18. }
    19. }

    对于put操作:
    image.png

    1. //方法二:手动用链表实现
    2. class LRUCache {
    3. // key -> Node(key, val)
    4. private HashMap<Integer, Node> map;
    5. // Node(k1, v1) <-> Node(k2, v2)...
    6. private DoubleList cache;
    7. // 最大容量
    8. private int cap;
    9. public LRUCache(int capacity) {
    10. this.cap = capacity;
    11. map = new HashMap<>();
    12. cache = new DoubleList();
    13. }
    14. public int get(int key) {
    15. if (!map.containsKey(key))
    16. return -1;
    17. int val = map.get(key).val;
    18. // 利用 put 方法把该数据提前
    19. put(key, val);
    20. return val;
    21. }
    22. public void put(int key, int val) {
    23. // 先把新节点 x 做出来
    24. Node x = new Node(key, val);
    25. if (map.containsKey(key)) {
    26. // 删除旧的节点,新的插到头部
    27. cache.remove(map.get(key));
    28. cache.addFirst(x);
    29. // 更新 map 中对应的数据
    30. map.put(key, x);
    31. } else {
    32. if (cap == cache.size()) {
    33. // 删除链表最后一个数据
    34. Node last = cache.removeLast();
    35. map.remove(last.key);
    36. }
    37. // 直接添加到头部
    38. cache.addFirst(x);
    39. map.put(key, x);
    40. }
    41. }
    42. }