Java 自定义实现 LRU 缓存算法
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缓存算法,能够高效地管理缓存,并在缓存满时淘汰最久未使用的数据。