手写LRU缓存的两种实现方式
创作时间:
作者:
@小白创作中心
手写LRU缓存的两种实现方式
引用
CSDN
1.
https://blog.csdn.net/agonie201218/article/details/136935173
LRU(Least Recently Used)缓存是一种常见的数据结构,用于实现缓存淘汰策略。本文将介绍两种实现LRU缓存的方法:使用Java自带的LinkedHashMap类和手写链表+HashMap的实现方式。
使用 LinkedHashMap 实现LRU 缓存
我们可以封装一个简易版的 LRU(LeastRecentlyUsed,最近最少使用) 缓存,确保当存放的元素超过容器容量时,将最近最少访问的元素移除。
具体实现思路如下:
- 继承
LinkedHashMap; - 构造方法中指定
accessOrder为 true ,这样在访问元素时就会把该元素移动到链表尾部,链表首元素就是最近最少被访问的元素; - 重写
removeEldestEntry方法,该方法会返回一个 boolean 值,告知LinkedHashMap是否需要移除链表首元素(缓存容量有限)。
public class LRUCache<K, V> extends LinkedHashMap<K, V> {
private final int capacity;
public LRUCache(int capacity) {
super(capacity, 0.75f, true);
this.capacity = capacity;
}
/**
* 判断size超过容量时返回true,告知LinkedHashMap移除最老的缓存项(即链表的第一个元素)
*/
@Override
protected boolean removeEldestEntry(Map.Entry<K, V> eldest) {
return size() > capacity;
}
}
将 accessOrder 设置为 true 并重写 removeEldestEntry 方法当链表大小超过容量时返回 true,使得每次访问一个元素时,该元素会被移动到链表的末尾。一旦插入操作让 removeEldestEntry 返回 true 时,视为缓存已满, LinkedHashMap 就会将链表首元素移除,由此我们就能实现一个 LRU 缓存。
LinkedHashMap 定义了排序模式 accessOrder(boolean 类型,默认为 false),访问顺序则为 true,插入顺序则为 false。
手写LRU(链表+hashmap)
import java.util.HashMap;
class LRUCache {
class Node {
int key;
int value;
Node prev;
Node next;
}
private void addNode(Node node) {
node.prev = head;
node.next = head.next;
head.next.prev = node;
head.next = node;
}
private void removeNode(Node node) {
Node prev = node.prev;
Node next = node.next;
prev.next = next;
next.prev = prev;
}
private void moveToHead(Node node) {
removeNode(node);
addNode(node);
}
private Node popTail() {
Node res = tail.prev;
removeNode(res);
return res;
}
private HashMap<Integer, Node> 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) {
Node node = cache.get(key);
if (node == null) {
Node newNode = new Node();
newNode.key = key;
newNode.value = value;
cache.put(key, newNode);
addNode(newNode);
size++;
if (size > capacity) {
Node tail = popTail();
cache.remove(tail.key);
size--;
}
} else {
node.value = value;
moveToHead(node);
}
}
}
热门推荐
中国发布全球首个干细胞数据管理国际标准,推动干细胞与再生医学领域健康发展
类似GTA5的手游盘点:五款经典的开放世界游戏推荐
2025年耐玩的沙盒类开放世界手游前十 自由探索的沙盒开放世界游戏大全
管弦乐队中的乐器,管弦乐队的四大乐器
管弦乐队中的木管乐器:长笛、单簧管、双簧管、大管和短笛
联合国难民署:刚果(金)安全和人道主义局势持续恶化
不同疫苗同时接种,这可行吗?
定期存款一年与三年,哪个更合算?
经纬恒润加入“无剑联盟”,携手推动RISC-V软件生态发展
《红楼梦》人物关系深度解析
医患共追“一道光”:上海瑞金医院首设复发淋巴瘤临床研究专病门诊
道家天道:探寻宇宙神秘韵律,感悟生命智慧之光
Excel 数据可视化:掌握 20 个图表、图形和绘图
福建移民海外有多少?解析移民现象与背后原因
大伯在法国,舅舅在英国,大姨西班牙:为什么福建人那么爱出国?
肺结节吃9天拜复乐缩小了是真的吗
梦见我在梦里被鬼压床
银行存折存款到期后如何转存?两种方式优缺点全解析
新月同行麻雀介绍 新月同行麻雀分析
胸痛、胸闷气短、心悸,小心抑郁会“不请自来”
通道四通八达 南昌开放势能澎湃
CRISPR基因编辑:医学革命的新希望
宁夏首例异基因造血干细胞移植成功完成
GTA 5 开发成本与 GTA 6 预算:大幅增加
体脂高怎么减肥?教你三招降低体脂率
投资案例:如何炒好股票?3招麻雀战法,进退自如,却少有人深究
乌鸡白凤丸,神奇中药还是隐藏风险?揭秘它的副作用与使用误区
开学第一课:哪吒的魔力台词如何点亮你的新学期
臭桂鱼的来历与制作方法
图形引擎实战:开放世界游戏制作分享