java实现LRU 缓存

embedded/2024/9/25 9:11:44/

如果碰到这种题⽬先不要慌张,现在脑海⾥回忆⼀遍 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/embedded/116543.html

相关文章

C语言从头学63—学习头文件stdlib.h(二)

6、随机数函数rand() 功能&#xff1a;产生0~RAND_MAX 之间的随机整数。 使用格式&#xff1a;rand(); //无参 返回值&#xff1a;返回随机整数 说明&#xff1a; a.RAND_MAX是一个定义在stdlib.h里面的宏&#xff0c;表示可以产生的最大随机整数&am…

3DGS 学习笔记

解说&#xff1a; 街景的新视角合成对于模拟的重要性&#xff0c;并介绍了目前实现此目标的主流技术是神经渲染&#xff0c;例如神经辐射场&#xff08;NeRF&#xff09;和三维高斯飞溅&#xff08;3DGS&#xff09;。然而&#xff0c;在处理街景时&#xff0c;当前方法在与训…

计算机毕业设计之:宠物互助平台的微信小程序系统(源码+文档+讲解)

博主介绍&#xff1a; ✌我是阿龙&#xff0c;一名专注于Java技术领域的程序员&#xff0c;全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师&#xff0c;我在计算机毕业设计开发方面积累了丰富的经验。同时&#xff0c;我也是掘金、华为云、阿里云、InfoQ等平台…

python爬虫:从12306网站获取火车站信息

代码逻辑 初始化 (init 方法)&#xff1a; 设置请求头信息。设置车站版本号。 同步车站信息 (synchronization 方法)&#xff1a; 发送GET请求获取车站信息。返回服务器响应的文本。 提取信息 (extract 方法)&#xff1a; 从服务器响应中提取车站信息字符串。去掉字符串末尾的…

如何更新Oracle表 LONG型的大文本学习

文章目录 前言一、LONG型的特点二、尝试修改过程1.Update尝试2.insert尝试3.变量定义尝试-14.变量定义尝试-25.更新字段尝试6.复制表尝试三、最终处理方式1.备份表2.更新字段内容-13.更新字段内容-2总结前言 前不久因业务需要,要在一个Oracle的表中修改一个LONG型字段内的内容…

物理学基础精解【16】

文章目录 参数方程曲线的参数方程概述曲线的参数方程一、定义二、公式三、计算四、例子1. 圆的参数方程2. 椭圆的参数方程3. 抛物线的参数方程 五、例题摆线概述 直线的参数方程一、定义二、公式三、计算四、例子五、例题 摆线的参数方程一、摆线的定义二、摆线的参数方程三、摆…

面试时遇见的项目问题

汽车在线销售平台项目 项目的甲方是谁&#xff1f; 甲方是一家汽车销售公司&#xff0c;他们希望通过互联网技术提升销售效率和服务质量 为什么要做这个项目&#xff1f; 很多消费者越来越倾向于在线上完成购车之前的大部分决策。所以甲方找到我们希望通过建立一个在线的销…

30. RabbitMQ消息丢失

1. 前言 RabbitMQ经常被用于服务模块之间的解耦以及高并发削峰场景,之前的章节讨论了不同服务模式的特点,但是在生产环境中,因为机器以及网络设备的不可靠,保证消息的可靠是待解决的问题。在特定场景下消息可能存在丢失风险,本文将介绍如何预防这类的风险。 2. RabbitMQ消…