AI 日报

Java 自定义实现 LRU 缓存算法

  • By admin
  • Oct 15, 2023 - 2 min read



LRU缓存算法简介

在计算机科学中,LRU(Least Recently Used)缓存算法是一种常用的缓存替换策略。该算法基于一个简单的原理:如果数据最近被访问过,那么将来被访问的概率也很高。相反,如果数据很久没被访问过,那么将来被访问的概率就很低。因此,LRU缓存算法会优先淘汰最近最少使用的数据,以减少缓存的命中率。

LRU缓存的实现思路

要实现LRU缓存算法,我们需要使用一个双向链表和一个哈希表。

双向链表用于存储缓存中的数据,按照访问的顺序排序。当新的数据被访问到时,我们将其插入到链表的头部,并将其标记为最近访问的数据。当缓存满了,我们将链表尾部的数据淘汰。

哈希表用于通过数据的键快速定位到链表中的节点。通过在哈希表中存储键和对应节点的指针,我们可以在O(1)的时间复杂度内获取或更新数据。

Java代码实现LRU缓存算法

import java.util.HashMap;
import java.util.Map;

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

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

    private int capacity;
    private Map cache;
    private Node head;
    private Node tail;

    public LRUCache(int capacity) {
        this.capacity = capacity;
        cache = new HashMap<>();
        head = new Node(0, 0);
        tail = new Node(0, 0);
        head.next = tail;
        tail.prev = head;
    }

    public int get(int key) {
        Node node = cache.get(key);
        if (node != null) {
            remove(node);
            insertToHead(node);
            return node.value;
        }
        return -1;
    }

    public void put(int key, int value) {
        Node node = cache.get(key);
        if (node != null) {
            remove(node);
            node.value = value;
            insertToHead(node);
        } else {
            if (cache.size() >= capacity) {
                Node tailPrev = tail.prev;
                remove(tailPrev);
                cache.remove(tailPrev.key);
            }
            Node newNode = new Node(key, value);
            cache.put(key, newNode);
            insertToHead(newNode);
        }
    }

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

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

以上就是Java自定义实现LRU缓存算法的代码。其核心是利用双向链表和哈希表来实现缓存的插入、删除和更新操作。通过维护链表的顺序和哈希表的键值对,可以快速找到最近访问的数据并进行操作。这样就实现了LRU缓存算法,能够高效地管理缓存,并在缓存满时淘汰最久未使用的数据。