LRU 缓存机制

https://leetcode-cn.com/problems/lru-cache/

  1. public class LRUCache {
  2. LinkedHashMap<Integer, Integer> map;
  3. public LRUCache(int capacity) {
  4. map = new LinkedHashMap<>(capacity + 2, 1, true){
  5. @Override
  6. protected boolean removeEldestEntry(Map.Entry<Integer, Integer> eldest) {
  7. return size() > capacity;
  8. }
  9. };
  10. }
  11. public int get(int key) {
  12. Integer r = map.get(key);
  13. if(r != null)
  14. return r;
  15. else return -1;
  16. }
  17. public void put(int key, int value) {
  18. map.put(key, value);
  19. }
  20. }
import java.util.HashMap;
import java.util.Map;

public class LRUCache {
    class Node {
        Node prev;
        Node next;
        int key;
        int value;

        public Node() {
        }

        public Node(int key, int value) {
            this.key = key;
            this.value = value;
        }
    }

    private Map<Integer, Node> map = new HashMap<>();
    private int size;
    private int capacity;
    private Node head, tail;

    public LRUCache(int capacity) {
        this.capacity = capacity;
        this.size = 0;
        head = new Node();
        tail = new Node();
        head.next = tail;
        tail.prev = head;
    }

    public int get(int key) {
        Node temp = map.get(key);
        if (temp == null)
            return -1;
        else {
            moveToFirst(temp);
            return temp.value;
        }
    }

    public void put(int key, int value) {
        Node temp = map.get(key);
        if (temp == null) { // 新节点
            Node add = new Node(key, value);
            addFirst(add);
            map.put(key, add);
            size++;
            if (size > capacity) {
                map.remove(remove(tail.prev));
            }
        } else {
            temp.value = value;
            moveToFirst(temp);
        }
    }

    private void moveToFirst(Node node) {
        remove(node);
        addFirst(node);
    }

    private void addFirst(Node node) {
        node.next = head.next;
        head.next = node;
        node.prev = head;
        node.next.prev = node;
    }

    private int remove(Node node) {
        node.prev.next = node.next;
        node.next.prev = node.prev;
        return node.key;
    }
}