当前位置: 首页 > news >正文

使用 LinkedList 实现一个高效的缓存系统

使用 LinkedList 实现一个高效的缓存系统通常涉及到实现一个最近最少使用(LRU, Least Recently Used)缓存淘汰算法。LRU 缓存是一种常用的缓存淘汰策略,它会在缓存满时淘汰最长时间未被使用的元素。

以下是使用 LinkedListHashMap 实现 LRU 缓存的步骤:

  1. 使用 LinkedList 存储缓存项的顺序:最近访问的项放在链表头部,最老访问的项放在链表尾部。
  2. 使用 HashMap 存储键和对应节点的映射:这样可以快速地通过键访问到缓存项的节点。

实现步骤:

  • 当访问一个缓存项时,如果它在缓存中:
    • 将其移动到链表的头部,表示最近被访问。
  • 如果缓存项不在缓存中:
    • 从链表尾部移除最老的项(如果缓存已满)。
    • 在链表头部添加新的缓存项。
    • HashMap 中添加键和新节点的映射。

示例代码:

import java.util.HashMap;
import java.util.Map;public class LRUCache<K, V> {private final int capacity;private final Map<K, Node<K, V>> map;private final LinkedList<Node<K, V>> list;public LRUCache(int capacity) {this.capacity = capacity;this.map = new HashMap<>();this.list = new LinkedList<>();}public V get(K key) {Node<K, V> node = map.get(key);if (node == null) {return null;}// Move the accessed node to the head of the listlist.remove(node);list.addFirst(node);return node.value;}public void put(K key, V value) {Node<K, V> node = map.get(key);if (node != null) {// Update the value and move to headnode.value = value;list.remove(node);list.addFirst(node);} else {// Create a new node and add to headif (map.size() == capacity) {// Remove the least recently used itemK lastKey = list.getLast().key;map.remove(lastKey);list.removeLast();}Node<K, V> newNode = new Node<>(key, value);list.addFirst(newNode);map.put(key, newNode);}}private static class Node<K, V> {K key;V value;Node<K, V> prev, next;public Node(K key, V value) {this.key = key;this.value = value;}}
}

使用示例:

public class LRUCacheDemo {public static void main(String[] args) {LRUCache<Integer, String> cache = new LRUCache<>(2);cache.put(1, "one");cache.put(2, "two");System.out.println(cache.get(1)); // 输出 "one"cache.put(3, "three"); // 淘汰 "two"System.out.println(cache.get(2)); // 输出 null,因为 "two" 已被淘汰cache.put(4, "four"); // 淘汰 "one"System.out.println(cache.get(1)); // 输出 null}
}

这个 LRUCache 类实现了一个简单的 LRU 缓存系统,它使用 LinkedList 来维护元素的访问顺序,并使用 HashMap 来快速定位元素。当缓存达到容量上限时,它会淘汰掉最老的元素。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • easyexcel使用教程--导入导出简单案例
  • 第十二章:设置pod和容器权限-保障集群内节点和⽹络安全
  • “微软蓝屏”事件敲响网络安全的警钟
  • C++(2)(数据的共享与保护)
  • Go语言入门
  • Linux安全与高级应用(四)深入探索MySQL数据库:安装、管理与安全实践
  • Journyx项目管理软件 soap_cgi.pyc XXE漏洞复现
  • 【限流与Sentinel超详细分析】
  • 4.8.双向循环神经网络
  • 【C++综合项目】——基于Boost库的搜索引擎(手把手讲解,小白一看就会!!)
  • 前端web开发HTML+CSS3+移动web(0基础,超详细)——第4天
  • priority_queue模拟实现【C++】
  • FFmpeg源码:av_realloc、av_reallocp、size_mult、av_realloc_f函数分析
  • Springboot 开发之 Quartz 任务调度框架简介
  • 自定义View-- wifi强度
  • 2019.2.20 c++ 知识梳理
  • Fundebug计费标准解释:事件数是如何定义的?
  • k8s如何管理Pod
  • Netty+SpringBoot+FastDFS+Html5实现聊天App(六)
  • Webpack 4 学习01(基础配置)
  • 复习Javascript专题(四):js中的深浅拷贝
  • 给新手的新浪微博 SDK 集成教程【一】
  • 使用 Node.js 的 nodemailer 模块发送邮件(支持 QQ、163 等、支持附件)
  • 使用前端开发工具包WijmoJS - 创建自定义DropDownTree控件(包含源代码)
  • 微信公众号开发小记——5.python微信红包
  • 学习ES6 变量的解构赋值
  • 深度学习之轻量级神经网络在TWS蓝牙音频处理器上的部署
  • Prometheus VS InfluxDB
  • TPG领衔财团投资轻奢珠宝品牌APM Monaco
  • 摩拜创始人胡玮炜也彻底离开了,共享单车行业还有未来吗? ...
  • 小白应该如何快速入门阿里云服务器,新手使用ECS的方法 ...
  • ​【原创】基于SSM的酒店预约管理系统(酒店管理系统毕业设计)
  • ​LeetCode解法汇总2670. 找出不同元素数目差数组
  • # .NET Framework中使用命名管道进行进程间通信
  • $redis-setphp_redis Set命令,php操作Redis Set函数介绍
  • (delphi11最新学习资料) Object Pascal 学习笔记---第14章泛型第2节(泛型类的类构造函数)
  • (leetcode学习)236. 二叉树的最近公共祖先
  • (Python第六天)文件处理
  • (二)hibernate配置管理
  • (附源码)springboot 房产中介系统 毕业设计 312341
  • (附源码)springboot炼糖厂地磅全自动控制系统 毕业设计 341357
  • (含笔试题)深度解析数据在内存中的存储
  • (论文阅读31/100)Stacked hourglass networks for human pose estimation
  • (没学懂,待填坑)【动态规划】数位动态规划
  • (免费分享)基于springboot,vue疗养中心管理系统
  • (十二)Flink Table API
  • (一)ClickHouse 中的 `MaterializedMySQL` 数据库引擎的使用方法、设置、特性和限制。
  • (转)JAVA中的堆栈
  • .java 指数平滑_转载:二次指数平滑法求预测值的Java代码
  • .net core 3.0 linux,.NET Core 3.0 的新增功能
  • .net core 外观者设计模式 实现,多种支付选择
  • .net core开源商城系统源码,支持可视化布局小程序
  • .NET8 动态添加定时任务(CRON Expression, Whatever)
  • .NetCore项目nginx发布
  • .net经典笔试题