小工具知识网

当前位置: 首页 > 行业知识 > 手撕LRU缓存——LinkedHashMap简易源码

行业知识

手撕LRU缓存——LinkedHashMap简易源码

2026-11-11 01:13:52 来源:互联网转载

题���链接:https://leetcode.cn/problems/lru-cache/description/?envType=study-plan-v2&envId=top-100-liked

原理非常简单,一个双端链表配上一个hash表。

首先我们要知道什么是LRU就是最小使用淘汰。怎么淘汰,链表尾部就是最不常用的直接删除,最近使用过的就移动到链表头部。要查找就利用hash表进行映射查找。

代码:

class LRUCache {    //需要定义的双端链表节点    //哈希表    class Node{        int key;        int value;        Node prev;        Node next;        public Node() {}        public Node(int _key,int _value) {            key = _key;            value = _value;        }    }    private Map cache = new HashMap();    private int size;    private int capacity;    private Node head,tail;    public LRUCache(int capacity) {        this.size = 0;        this.capacity = capacity;        head = new Node();        tail = new Node();        head.next = tail;        tail.prev = head;    }        public int get(int key) {        Node node = cache.get(key);        if(node == null)             return -1;        moveToHead(node);        return node.value;    }        public void put(int key, int value) {        //如果存在        if(cache.containsKey(key)){            Node t = cache.get(key);            t.value = value;            moveToHead(t);        }else{            //如果不存在            size++;            if(size>capacity){                cache.remove(tail.prev.key);                //System.out.println(tail.prev.key);                moveTail();                size--;            }            Node node = new Node(key,value);            Node temp = head.next;            head.next = node;            node.prev = head;            temp.prev = node;            node.next = temp;            cache.put(key,node);        }    }    public void moveToHead(Node node){        //本身删除了        Node qian = node.prev;        qian.next = node.next;        node.next.prev = qian;        //再插到头部        Node temp = head.next;        head.next = node;        node.prev = head;        temp.prev = node;        node.next = temp;    }    public void moveTail(){        Node temp = tail.prev.prev;        temp.next = tail;        tail.prev = temp;    }}/** * Your LRUCache object will be instantiated and called as such: * LRUCache obj = new LRUCache(capacity); * int param_1 = obj.get(key); * obj.put(key,value); */

上一篇:域名怎么绑定在服务器上?

下一篇:揭秘Z的意思,未知符号背后的神秘含义探索