LinkedList 实现 LRU 缓存

LRU(Least Recently Used,最近最少使用)缓存是一种缓存淘汰策略,用于在缓存满时淘汰最久未使用的元素。

关键:

缓存选什么结构?

怎么实现访问顺序?

import java.util.*;public class LRUCache<K, V> {private final int capacity; // 缓存容量private final Map<K, V> cache; // 用于存储缓存数据private final LinkedList<K> order; // 用于维护访问顺序public LRUCache(int capacity) {this.capacity = capacity;this.cache = new HashMap<>(capacity);this.order = new LinkedList<>();}public V get(K key) {if (!cache.containsKey(key)) {return null; // 如果缓存中不存在该键,返回 null}// 将访问的键移到队列的尾部,表示最近使用order.remove(key);order.addLast(key);return cache.get(key);}public void put(K key, V value) {if (cache.containsKey(key)) {// 如果缓存中已经存在该键,更新值并将键移到队列的尾部cache.put(key, value);order.remove(key);order.addLast(key);} else {if (cache.size() >= capacity) {// 如果缓存满了,移除最久未使用的键K oldestKey = order.removeFirst();cache.remove(oldestKey);}// 添加新键值对到缓存cache.put(key, value);order.addLast(key);}}public static void main(String[] args) {LRUCache<String, String> lruCache = new LRUCache<>(3);lruCache.put("1", "one");lruCache.put("2", "two");lruCache.put("3", "three");System.out.println(lruCache.get("1")); // 输出: onelruCache.put("4", "four");System.out.println(lruCache.get("2")); // 输出: null (因为2是最久未使用的)}
}

 测试讲解:

先定义了大小为3的缓存,然后存1,2,3,此时的访问顺序1-2-3,list头部是最早访问的,尾部是最晚访问的,此时缓存已满,然后访问了1,则现在的顺序是2-3-1,可见,2是那个最久没被访问的,我再添加新元素4时,需要删除的是2,顺序变成3-1-4。

        

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/387813.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql 慢查询调优实战——between and

现象 SQL报警慢查询 原SQL select * from awards_record WHERE ( create_time between 2024-07-01 00:00:00 and 2024-07-30 00:18:58.004)索引信息 KEY idx_createtime (create_time) USING BTREEexplain分析&#xff0c;发现没走上面的索引 原因 查询数据时&#xff0…

PHP反序列化漏洞从入门到深入8k图文介绍,以及phar伪协议的利用

文章参考&#xff1a;w肝了两天&#xff01;PHP反序列化漏洞从入门到深入8k图文介绍&#xff0c;以及phar伪协议的利用 前言 本文内容主要分为三个部分&#xff1a;原理详解、漏洞练习和防御方法。这是一篇针对PHP反序列化入门者的手把手教学文章&#xff0c;特别适合刚接触PH…

Java学习Day19:基础篇9

包 final 权限修饰符 空着不写是default&#xff01; 代码块 1.静态代码块 1.静态代码块优于空参构造方法 2.静态调用只被加载一次&#xff1b; 静态代码块在Java中是一个重要的特性&#xff0c;它主要用于类的初始化操作&#xff0c;并且随着类的加载而执行&#xff0c;且只…

Kafka知识总结(分区机制+压缩机制+拦截器+副本机制)

文章收录在网站&#xff1a;http://hardyfish.top/ 文章收录在网站&#xff1a;http://hardyfish.top/ 文章收录在网站&#xff1a;http://hardyfish.top/ 文章收录在网站&#xff1a;http://hardyfish.top/ 分区机制 分区策略 分区策略是决定生产者将消息发送到哪个分区的…

明天(8月1日)起施行,这些新规将影响你我生活。

文章目录 I 地方性新规1.1 无需再出示残疾纸质证件1.2《甘肃省反家庭暴力条例》1.3 新修订的《内蒙古自治区失业保险实施办法》II 全面性新规2.1《中药饮片标签管理规定》2.2 亮码可办2.3 免税额度提高至12000元2.4 矿山生态修复国家标准正式施行2.5《公平竞争审查条例》2.6 《…

力扣 位运算

位运算基础的异或运算&#xff0c;线性时间复杂度和常数空间复杂度。 题目 class Solution {public int singleNumber(int[] nums) {int ans 0;for (int i: nums) {ans ^ i;}return ans;} }

焦化行业超低排放改造巩固提升方案(朗观视觉)

朗观视觉小编观察发现&#xff1a;随着全球对环境保护意识的日益增强&#xff0c;焦化行业作为高污染、高排放的工业领域&#xff0c;其超低排放改造已成为行业转型升级的必然趋势。为了积极响应国家关于推进生态文明建设、打赢蓝天保卫战的号召&#xff0c;山东省生态环境厅发…

Socket通信(C++)

文章目录 什么是SocketSocket通信过程C Socket通信APIint socket(int domain, int type, int protocol);int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);struct sockaddrstruct sockaddr_unstruct sockaddr_in / struct sockaddr_in6 int connect(int …

【JavaEE精炼宝库】 网络编程套接字——初识网络编程 | UDP数据报套接字编程

文章目录 一、网络编程基础1.1 网络编程的意义&#xff1a;1.2 网络编程的概念&#xff1a;1.3 网络编程的术语解释&#xff1a;1.4 常见的客户端服务端模型&#xff1a; 二、Socket 套接字2.1 Socket 套接字的概念&#xff1a;2.2 Socket 套接字的分类&#xff1a; 三、UDP数据…

day06

ES文档创建删除流程&#xff1f; ES文档查询流程? Logstash的写入ES失败的原因&#xff1f; 写入节点挂了 逻辑判断都没失败写入空 索引名称命名不规范&#xff0c;全部小写不能下划线开头 内存不够&#xff08;logstash、ES&#xff09; 索引上限&#xff08;到达最大打开…

vue项目实战 vueCropper 仿微信头像任意区域截取图片,上传到腾讯云保存

在package.json中添加 "vue-cropperjs": "4", 后在控制台执行&#xff1a;npm install ImageCropper.vue <template><div v-if"src"><!-- Vue Cropper区域 --><el-row class"cropper-wrapper" v-if"src…

Vue2从基础到实战(指令修饰符)详解

什么是指令修饰符&#xff1f; 指令修饰符就是通过“.”指明一些指令后缀 不同的后缀封装了不同的处理操作 —> 简化代码 按键修饰符 keyup.enter —>当点击enter键的时候才触发 v-model修饰符 v-model.trim —>去除首位空格 v-model.number —>转数字 事件修…

【Vulnhub靶机tomato渗透】

第一步&#xff1a;端口扫描 我使用的是webrobot 访问这个ip&#xff0c;就是它了 第二步&#xff1a;目录扫描 打开kali使用dirb命令扫描http://192.168.189.154下的目录 dirb http://192.168.189.154扫描到目录。 第三步&#xff1a;访问目录地址 看到有几个php的文件 第…

设计模式笔记(一)

目录 设计模式共有23种&#xff0c;也可称为GOF23 单例模式&#xff08;重点&#xff0c;常用&#xff09; 工厂模式 代理模式&#xff1a;&#xff08;SpringAOP的底层原理&#xff09; 静态代理模式&#xff1a;&#xff08;写死一个代理类Proxy&#xff09; 动态代理模…

快速开启react+electron应用,搭建启动问题

注意&#xff1a; React 本地启动在 3000端口Electron 在创建 BrowserWindow 的时候&#xff0c;可以读取本地的文件或者是 url开发环境 读取localhost: 3000生产环境 需要加载本地成型以后的本地文件&#xff0c;打包的时候再考虑 一 react 脚手架 create-react-app 快速搭建…

QT--聊天室

一、设计要求 用QT做一个聊天室&#xff0c; 制作一个服务器和客户端。可以进行注册、登录&#xff0c; 登陆成功后可以使用昵称进行发送、接收消息。 能根据昵称、聊天内容查询历史记录&#xff0c;也可以查询全部聊天记录。 。 二、客户端三级ui界面 三、项目代码 //在…

IDEA管理远程仓库Git

1、模拟项目 新建一个文件夹&#xff0c;用来这次演示 用IDEA来打开文件夹 2、创建仓库 在IDEA中给该文件夹创建本地仓库和远程仓库 在菜单栏找到VCS选择Share project on Gitee 在弹窗中输入描述信息 接下来会出现以下弹窗 点击ADD后&#xff0c;在gitee上会创建远程仓库 …

嵌入式开发服务器与客户端交互 日志2024/7/31

嵌入式开发服务器与客户端交互 客户端 网页 操作 请求相关代码: 这里为了适配 低版本浏览器 用的不是fetch 当然用fetch更好 var curUlr window.location.href; //获取当前网页地址var newURL curUlr.lastIndexOf("/");//截取到最后一个斜杠索引var pathUrl…

mysql 数据库空间统计sql

mysql 数据库空间统计 文章目录 mysql 数据库空间统计说明一、数据库存储代码二、查询某个数据库的所有表的 代码三、列出所有已经产生碎片的表总结 说明 INFORMATION_SCHEMA Table Reference 表参考 information_schema是‌MySQL中的一个特殊数据库&#xff0c;它存储了关于…

MLP多层感知机与Pytorch实现

参考文章&#xff1a; 1.动手学深度学习——多层感知机&#xff08;原理解释代码详解&#xff09;_多层感知机 代码-CSDN博客 2.4.1. 多层感知机 — 动手学深度学习 2.0.0 documentation 3.深度理解多层感知机&#xff08;MLP&#xff09; | 米奇妙妙屋 1. 神经网络由来 神经网…