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 Mapcache; 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缓存算法,能够高效地管理缓存,并在缓存满时淘汰最久未使用的数据。