LRU缓存机制

 

 方法一:Map加双向链表

class LRUCache {

    class Node {
        public int key, val;
        Node pre,next;
        public Node() {}
        public Node(int k, int v) {
            key = k;
            val = v;
        }
    }
    private Map<Integer,Node> map = new HashMap<>();
    private Node root, tail;
    private int num, capacity;

    public LRUCache(int capacity) {
        this.capacity = capacity;
        this.num = 0;
        root = new Node();
        tail = new Node();
        root.next = tail;
    }
    public int get(int key) {
        Node n = map.get(key);
        if(n == null) return -1;
        removeToHead(n);
        return n.val;
    }
    
    public void put(int key, int value) {
        Node n = map.get(key);
        if(n == null) {
            Node newNode = new Node(key,value);
            if(num == capacity) {
                Node del = removeLast();
                map.remove(del.key);
                num--;
            }
            addToHead(newNode);
            map.put(key,newNode);
            num++;
        } else {
            n.val = value;
            removeToHead(n);
        }
    }
    private void addToHead(Node n) {
        root.next.pre = n;
        n.next = root.next;
        root.next = n;
        n.pre = root;
    }
    private void deleteNode(Node n) {
        n.pre.next = n.next;
        n.next.pre = n.pre;
    }
    private void removeToHead(Node n) {
        deleteNode(n);
        addToHead(n);
    }
    private Node removeLast() {
        Node res = tail.pre;
        deleteNode(res);
        return res;
    }

}

方法二:LinkedHashMap

class LRUCache {
    int capacity;
    LinkedHashMap<Integer, Integer> cache;

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

    public int get(int key) {
        return cache.getOrDefault(key, -1);
    }

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

 

posted @ 2020-07-23 21:13  Sexyomaru  阅读(110)  评论(0编辑  收藏  举报