java实现LRU 缓存

devtools/2024/11/15 3:59:33/

如果碰到这种题⽬先不要慌张,现在脑海⾥回忆⼀遍 LRU 的基本概念:LRU(Least Recently Used,最近最少使⽤)是⼀种缓存算法,其核⼼思想是将最近最少使⽤的缓存项移除,以便为更常 ⽤的缓存项腾出空间。

适⽤场景:

  • 频繁访问:LRU 算法适⽤于那些有频繁访问的数据,⽐如缓存、⻚⾯置换等场景。
  • 有局部性:当访问模式具有局部性,即近期访问的数据更可能在未来被再次访问时,LRU 算法 能够有较好的表现。
  • 数据访问分布均匀:如果数据的访问分布较为均匀,没有出现热点数据或周期性访问模式, LRU 算法的命中率较⾼。
  • 缓存容ᰁ适中:LRU 算法适⽤于缓存容ᰁ适中的场景,过⼤的缓存可能导致淘汰开销增⼤,⽽过⼩的缓存则可能导致频繁缓存失效。

在 Java 中,可以使⽤ LinkedHashMap 来实现 LRU 缓存。使⽤LinkedHashMap实现 LRU 缓存可 以极⼤地简化代码,因为LinkedHashMap已经内置了按照访问顺序排序的功能。所以使⽤LinkedHashMap 确实可以避免⼿动实现双向链表和节点的逻辑。

为了使⽤ LinkedHashMap 来实现 LRU 缓存,在创建 LinkedHashMap 对象时设置它的访问顺序为 true,这样元素将按照访问顺序进⾏排序。然后,我们可以重写它的 removeEldestEntry ⽅法来控制 是否移除最⽼的数据。

java">import java.util.LinkedHashMap;
import java.util.Map;
public class LRUCache<K,V> extends LinkedHashMap<K, V> {private int capacity;public LRUCache(int capacity){super(capacity,0.75f, true);this.capacity = capacity;}public void setValue(K key, V value){super.put(key, value);}public V getValue(K key){return super.getOrDefault(key,null);}@Overrideprotected boolean removeEldestEntry(Map.Entry<K, V> eldest) {return size() > capacity;}public static void main(String[] args) {LRUCache<Integer, String> lruCache = new LRUCache<>(4);lruCache.setValue(1, "a");lruCache.setValue(2, "b");lruCache.setValue(3, "c");lruCache.setValue(4, "d");System.out.println(lruCache.getValue(1));lruCache.put(5, "e");System.out.println(lruCache.getValue(2));}
}

加深巩固:

leecode: 146. LRU 缓存 - 力扣(LeetCode)

题解:

java">class LRUCache extends LinkedHashMap<Integer,Integer>{private int capacity;public LRUCache(int capacity) {super(capacity,0.75f,true); // 开启accessOrder属性,访问元素后将访问的元素放到链表末端this.capacity = capacity;}public int get(int key) {return super.getOrDefault(key, -1); // 如果存在,将会放到链表末端表示它是最近使用的。}public void put(int key, int value) {super.put(key,value);}//  判断size超过容量时返回true,告知LinkedHashMap移除最老的缓存项(即链表的第一个元素)@Overridepublic boolean removeEldestEntry(Map.Entry<Integer,Integer> eldest) {return size() > capacity;   }
}/*** Your LRUCache object will be instantiated and called as such:* LRUCache obj = new LRUCache(capacity);* int param_1 = obj.get(key);* obj.put(key,value);*/


http://www.ppmy.cn/devtools/115487.html

相关文章

鸿蒙4.0(HarmonyOS 4.0)与鸿蒙Next(HarmonyOS Next)区别

鸿蒙4.0&#xff08;HarmonyOS 4.0&#xff09;与鸿蒙Next&#xff08;HarmonyOS Next&#xff09;是华为推出的两个不同版本的操作系统&#xff0c;它们之间存在一些显著的区别&#xff1a; 兼容性&#xff1a; 鸿蒙4.0&#xff1a;依然保持了对Android应用的兼容性&#xff0…

【30天玩转python】使用第三方库(如 NumPy、Pandas)

使用第三方库&#xff08;如 NumPy、Pandas&#xff09; Python 的强大之处在于其广泛的第三方库生态&#xff0c;特别是在科学计算、数据分析等领域。NumPy 和 Pandas 是 Python 最常用的两个库&#xff0c;分别用于数值计算和数据处理。学习和掌握这些库将极大地提升你的编程…

医学数据分析实训 项目九 糖尿病风险预测

文章目录 综合实践二 糖尿病遗传风险预测一、分析目标二、实现步骤三、数据准备四、特征工程五、模型构建六、性能度量七、提交要求 综合实践任务二 糖尿病遗传风险预测代码&#xff08;一&#xff09;数据准备&#xff08;二&#xff09;特征工程&#xff08;三&#xff09;模…

网络安全。

文章目录 目录 文章目录 一. 网络安全概述 二. 密码学原理 三. 报文完整性和数字签名 密码散列函数 报文鉴别码 数字签名 公钥认证 四. HTTPS通信 总结 一. 网络安全概述 网络安全是保护计算机网络及其数据免受各种威胁和攻击的实践和技术。随着互联网的普及和数字化…

saas收银系统源码

1. 线下门店多样化收银 ①门店有社区小店、也会有大店&#xff0c;甚至还会有夫妻店&#xff0c;同时还要有Windows版和安卓版&#xff0c;需满足不同门店的收银需求。 ②支持Windows收银、安卓收银、无人自助收银、聚合码收银等&#xff0c;支持ai智能称重、收银称重一体机等…

前端实用工具(二):编程规范化解决方案

目录 本地代码规范化工具 代码检测工具ESLint 代码格式化工具Prettier 远程代码规范化工具 远程提交规范化工具commitizen 提交规范检验工具commitlint husky 什么是git hooks commitlint安装 husky安装 检测代码提交规范 ESLint husky 自动修复格式错误lint-staged…

STM32快速复习(十二)FLASH闪存的读写

文章目录 一、FLASH是什么&#xff1f;FLASH的结构&#xff1f;二、使用步骤1.标准库函数2.示例函数 总结 一、FLASH是什么&#xff1f;FLASH的结构&#xff1f; 1、FLASH简介 &#xff08;1&#xff09;STM32F1系列的FLASH包含程序存储器、系统存储器和选项字节三个部分&…

掌控历史:如何通过Git版本管理工具提升你的开发效率

先一览全局: git目录 一.打开git二.git bash的基础命令三.配置git四.仓库搭建五.文件操作和状态六.忽略文件七.gitee的使用1.添加公钥2.创建仓库 八.vs中使用git九.git分支常用命令十.文件差异比较十一.文件回溯和推进十二.合并冲突和消除十三.合并/压缩提交十四.远程仓库推拉十…