LRU 缓存的两种实现方式

java之LRU缓存实现 LRU缓存实现(Java) LRU是Least Recently Used 的缩写,翻译过来就是“最近最少使用”,LRU缓存就是使用这种原理实现,简单的说就是缓存一定量的数据,当超过设定的阈值时就把一些过期的数据删除掉,比如我们缓存10000条数据,当数据小于10000时可以随意添加,当超过10000时就需要把新的数据添加进来,同时要把过期数据删除,以确保我们最大缓存10000条,那怎么确定删除哪条过期数据呢,采用LRU算法实现的话就是将最老的数据删掉,废话不多说,下面来说下Java版的LRU缓存实现 Ja 阅读详情

 

一、使用LinkedHashMap实现

class LRUCache {
    Map<Integer, Integer> cache=null;
    public LRUCache(int capacity) {
        cache = new LinkedHashMap<>(capacity, 0.75f, true){
            @Override
            public boolean removeEldestEntry(Map.Entry eldest){
                if(this.size()>capacity){
                    return true;
                }
                return false;
            }
        };
    }
    
    public int get(int key) {
        Integer v = this.cache.get(key);
        return v==null?-1:v.intValue();
    }
    
    public void put(int key, int value) {
        this.cache.put(key,value);
    }
}

二、使用HashMap 和DoubleList 实现

 

class LRUCache {
    int capacity;
    DoubleList cache;
    Map<Integer, Node> map;
    public LRUCache(int capacity) {
        this.capacity = capacity;
        cache = new DoubleList();
        map = new HashMap<>();
    }
    
    public int get(int key) {
        if(!map.containsKey(key)){
            return -1;
        }
        Node tmp = map.get(key);
        cache.remove(tmp);
        cache.addFirst(tmp);
        return tmp.value;
    }
    
    public void put(int key, int value) {
        Node cur = new Node(key, value);
        if(map.containsKey(key)){
            cache.remove(map.get(key));
            cache.addFirst(cur);
            map.put(key, cur);
        }else{
            if(capacity == cache.size){
                Node del = cache.removeLast();
                map.remove(del.key);
            }
            map.put(key, cur);
            cache.addFirst(cur);
        }
    }

    class DoubleList{
        Node head, tail;
        int size; //链表的长度
        public DoubleList(){
            head = new Node(0, 0);
            tail = new Node(0, 0);
            head.next = tail;
            tail.pre = head;
            size = 0;
        }
        //// 在链表头部添加节点 x, 时间 O(1)
        public void addFirst(Node cur){
            Node next = head.next;
            cur.next = next;
            next.pre = cur;
            head.next = cur;
            cur.pre = head;
            size++;
        }
        // 删除链表中的 x 节点(x ⼀定存在)
        // 由于是双链表且给的是⽬标 Node 节点, 时间 O(1)
        public void remove(Node node){
            Node prev = node.pre;
            prev.next =  node.next;
            prev.next.pre = prev;
            size--;
        }
        // 删除链表中最后⼀个节点, 并返回该节点, 时间 O(1)
        public Node removeLast(){
            if(size == 0)
                return null;
            Node del = tail.pre;
            remove(del);
            return del;
        }
    }

    class Node{
        int key ,value;
        Node pre, next;
        public Node(int key, int value){
            this.key = key;
            this.value = value;
        }
    }
    
    public static void main(String[] args){
        /* 缓存容量为 2 */
        LRUCache cache = new LRUCache(2);
        // 你可以把 cache 理解成⼀个队列
        // 假设左边是队头, 右边是队尾
        // 最近使⽤的排在队头, 久未使⽤的排在队尾
        // 圆括号表⽰键值对 (key, val)
        cache.put(1, 1);
        // cache = [(1, 1)]
        cache.put(2, 2);
        // cache = [(2, 2), (1, 1)]
        cache.get(1); // 返回 1
        // cache = [(1, 1), (2, 2)]
        // 解释: 因为最近访问了键 1, 所以提前⾄队头
        // 返回键 1 对应的值 1
        cache.put(3, 3);
        // cache = [(3, 3), (1, 1)]
        // 解释: 缓存容量已满, 需要删除内容空出位置
        // 优先删除久未使⽤的数据, 也就是队尾的数据
        // 然后把新的数据插⼊队头
        cache.get(2); // 返回 -1 (未找到)
        // cache = [(3, 3), (1, 1)]
        // 解释: cache 中不存在键为 2 的数据
        cache.put(1, 4);
        // cache = [(1, 4), (3, 3)]
        // 解释: 键 1 已存在, 把原始值 1 覆盖为 4
        // 不要忘了也要将键值对提前到队头
    }
}

/**
 * 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);
 */

 

 

Isaac Sim仿真平台学习(2)系统架构 isaac sim系统架构 阅读详情

相关推荐

【通信协议】I2C总线(一主多从)

I2C总线(一主多从)之软件模拟代码详解

m0_75090944的博客 9844

LRU缓存实现

LRU算法c++实现

qq_44054791的博客 507

手把手教你用RMII接口配置以太网PHY芯片(附YT8512实战代码)

本文详细介绍了如何使用RMII接口配置以太网PHY芯片,以国产YT8512为例,提供从硬件设计到软件驱动的全流程实战指南。内容包括RMII接口技术解析、YT8512硬件设计要点、驱动开发实战代码及常见问题排查,帮助开发者快速实现以太网通信功能。

mac99的博客 996

缓存淘汰算法--LRU算法

 缓存淘汰算法--LRU算法               1. LRU 1.1. 原理 LRU(Least recently used,最近最少使用)算法根据数据的历史访问记录来进行淘汰数据,其核心思想是“如果数据最近被访问过,那么将来被访问的几率也更高”。 1.2. 实现 最常见的实现是使用一个链表保存缓存数据,详细算法实现如下: 1. 新数据插入到链表头部

jeff_0825的专栏 1105

ubuntu20.04配置UR机械臂的仿真环境

gazebo和rviz中的机械臂的位姿是一样的,要实现同步控制,可以拖动rviz中的球移动到指定位置,点击plan观察路径规划,点击execute执行该路径规划,可以在gazebo和rviz中同步看到刚刚的路径规划运动,实现了简单的机械臂仿真环境搭建。这是因为catkin找的python版本为anaconda下面的版本,所以需要改为指定采用下面的命令,参考之前的。之后要source一下,才能读取到工作空间里的文件,以后每次打开终端进入工作空间都要执行该命令。时,一直不成功,解决办法可以看我之前写的。

weixin_48319333的博客 3494

别再死记硬背了!用Python可视化带你直观理解柯西收敛定理(附NumPy代码)

本文通过Python可视化技术,结合NumPy和Matplotlib,直观展示柯西收敛定理的动态过程。文章提供了完整的代码实现,帮助读者从抽象数学定义过渡到具象理解,特别适合数学学习者和Python开发者。通过热力图和交互式参数探索,读者可以清晰观察数列收敛特性,提升数学分析的学习效率。

weixin_28465009的博客 186

LRU (最近最少使用) 缓存实现的两种方式

题目如下 LRU最近最少使用,是一种常用的页面置换算法,在容量一定的情况下,删除内存中最近最久未使用的数据。 首先第一种方式:Map 利用在Map当中键值的方式进行存储数据,它的特性就是我们新加入set进去的键值对在其内部是有顺序排列的,及我们set一个键值对它就会去放在后面,这时如果我们容量已满,那么只需要删除掉第一个键值即可(因为常使用(把他移到后方)的和新进入的都会在后方添加进去),然后就实现了一个LRU算法 具体解释都已在代码详细注释 // 第一种方式Map方式 // Map中set加入的键值对是

weixin_51935690的博客 1861

用VFP计算 CRC-16 Modbus 校验位

1. Modbus是一种串行通信协议,最初由Modicon(目前属于施耐德电气公司)于1979年开发2. Modbus协议是应用在Modicon产品上的,后来才被移植到其他产品上3. Modbus协议的通信接口可以有多种选择,如RS232、RS485、以太网等。

lddnzx的博客 519

LRU算法四种实现方式介绍

LRU全称是Least Recently Used,即最近最久未使用的意思。 LRU算法的设计原则是:如果一个数据在最近一段时间没有被访问到,那么在将来它被访问的可能性也很小。也就是说,当限定的空间已存满数据时,应当把最久没有被访问到的数据淘汰。 实现LRU       1.用一个数组来存储数据,给每一个数据项标记一个访问时间戳,每次插入新数据项的时候,先把数组中存

elricboa的专栏 20万+

具身智能:从理论突破到场景落地的全解析

具身智能(Embodied Intelligence)是人工智能与机器人学深度融合的前沿领域,其核心在于通过物理实体与环境的动态交互实现智能行为。区别于传统 AI 的 “离身性”(如语音助手仅依赖数据输入),具身智能强调 “智能体通过身体感知世界并反作用于环境”,形成 “感知 - 决策 - 行动” 的闭环。例如,能自主避障的配送机器人、可精准抓取异形物体的机械臂,均通过传感器网络与环境实时互动,在试错中优化行为策略。

LeeKumaの技术Note 2683

【Mode】FDE 求解器工作流程

Lumerical---FDE(Finite Difference Eigenmode) Solver

u011699626的博客 4943

数据结构 - lru&lfu实现(Java)

文章目录1. LRU 基于哈希表和双向链表的LRU算法实现2. LFU(LinkedHashSet)LRU与LFU的区别 1. LRU 基于哈希表和双向链表的LRU算法实现 缓存看这篇 LinkedHashMap的LRUCache实现 设计思路是,使用哈希表存储 key,值为链表中的节点,节点中存储值,双向链表来记录节点的顺序,头部为最近访问节点。 LRU算法中有两种基本操作: get(key):查询key对应的节点,如果key存在,将节点移动至链表头部。 set(key, value): 设置key对

littlewhitevg的博客 1375

可维护的 SAP UI5 Theming 策略:从 CSS 级联与特性选择器到 UI Theme Designer 的工程化落地

摘要:SAP UI5主题化是一个涉及CSS级联、选择器特异性和主题参数的系统工程,与应用逻辑解耦以实现品牌化和无障碍适配。轻量级调整优先使用附加CSS,重大改动才考虑创建新主题。样式冲突需通过特异性原则解决,避免滥用!important。动态添加样式应使用addStyleClass而非直接操作DOM。主题可通过bootstrap参数、URL或运行时API设置,企业级主题推荐使用UI Theme Designer。自定义内容应消费主题变量以实现一致性,避免直接修改控件内部结构或内联样式。工程化落地需规范分层和

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 307

LRU缓存的两种实现方式,双链表+哈希表;数组

双链表+哈希表 class LRU { public: LRU(size_t _capacity) : capacity(_capacity) {} ~LRU() {} void set(int key, int val) { auto it = cache.find(key); if (it != cache.end()) { dlist.erase(it->second); dlist.push

weixin_41054345的博客 278

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

自己动手实现一个 LRU

作者简介:大家好,我是码炫码哥,前中兴通讯、美团架构师,现任某互联网公司CTO,兼职码炫课堂主讲源码系列专题代表作:《jdk源码&多线程&高并发》,《深入tomcat源码解析》,《深入netty源码解析》,《深入dubbo源码解析》,《深入springboot源码解析》,《深入spring源码解析》,《深入redis源码解析》等联系qq:184480602,加我进群,大家一起学习,一起进步,一起对抗互联网寒冬LRU,即 Least Recently Use ,直译为 “最近最少使用”。

smart_an的专栏 935

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

LRU 缓存实现

LRU缓存的设计思想: 在有限的空间下,如何访问和更新其中的元素. LRU缓存的设计原则: 如果一个数据在一段时间内没有被访问,以后这个数据被访问到的可能性也非常小,当访问的空间满时,删除最久的没有访问过的数据. 使用hashmap加双向链表 import sun.applet.Main; import java.util.HashMap; import java.util.Map; ...

厚积薄发的博客 881

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

【LeetCode】LRU 缓存

#LeetCode每日一题【链表专题】 LRU 缓存 https://leetcode-cn.com/problems/lru-cache/ 分析 这题属于算法设计题,考察对哈希以及双向链表的掌握程度。 LRU:“最近最少使用”,常用于缓存过期策略,即当缓存内存快溢出的时候,淘汰"最近最少使用"的缓存。 借鉴Java中的LinkedHashMap的做法:哈希+双链表;相比于普通的hashmap,linkedhashmap中的节点Node多了一个before、after节点,用于维护双向链表连接各节点表示前

shijiujiu33的博客 1282

LRU缓存介绍与实现 (Java)

引子: 我们平时总会有一个电话本记录所有朋友的电话,但是,如果有朋友经常联系,那些朋友的电话号码不用翻电话本我们也能记住,但是,如果长时间没有联系了,要再次联系那位朋友的时候,我们又不得不求助电话本,但是,通过电话本查找还是很费时间的。但是,我们大脑能够记住的东西是一定的,我们只能记住自己最熟悉的,而长时间不熟悉的自然就忘记了。 其实,计算机也用到了同样的一个概念,我们用缓存来存放以前读取的数

Yuwen's Hero 5万+

LRU缓存实现(Java)

LRU是Least Recently Used 的缩写,翻译过来就是“最近最少使用”,LRU缓存就是使用这种原理实现,简单的说就是缓存一定量的数据,当超过设定的阈值时就把一些过期的数据删除掉,比如我们缓存10000条数据,当数据小于10000时可以随意添加,当超过10000时就需要把新的数据添加进来,同时要把过期数据删除,以确保我们最大缓存10000条,那怎么确定删除哪条过期数据呢,采用LRU算法实现的话就是将最老的数据删掉,废话不多说,下面来说下Java版的LRU缓存实现。

guanshengg的博客 714

LRU算法及Java实现

LRU算法介绍 LRU是Least Recently Used的缩写,即最近最少使用,常用于页面置换算法,为虚拟页式存储管理服务。LRU算法的提出,是基于这样一个事实:在前面几条指令中使用频繁的页面很可能在后面的几条指令中频繁使用。反过来说,已经很久没有使用的页面很可能在未来较长的一段时间内不会被用到。这个,就是著名的局部性原理。此外,LRU算法也经常被用作缓存淘汰策略。本文将基于LRU算法的思想...

To be a great coder 1万+

LRU算法

使用一个哈希表,把页号作为键,把缓存在队列中的节点的地址作为值,只需要把这个页 对应的节点移动到队列的前面,如果需要的页面在内存中,此时需要把这个页面加载到内 存中,简单的说,就是将一个新节点添加到队列前面,并在哈希表中跟新相应的节点地 址,如果队列是满的,那么就从队尾移除一个节点,并将新节点添加到队列的前面。⽽往往最常读取的,也就是读取次数最多的,所以利⽤好LRU算法,我们能够提供对热点数据的缓存效率,能够提⾼缓存服务的内存使⽤率。使用双向链表实现的队列,队列的最大容量为缓存的大小。

刘皇叔说Java的博客 877

深入理解缓存淘汰策略:LRU vs LFU 完全解析

在现代软件系统中,缓存是提高性能的关键技术之一。然而,由于内存资源有限,我们需要合理的淘汰策略来决定哪些数据应该被移除。LRU(Least Recently Used)和LFU(Least Frequently Used)是两种最常见的缓存淘汰算法。本文将深入探讨这两种算法的原理、实现、应用场景以及它们之间的核心差异。是否有明显的时间局部性?├─ 是 → 优先选择 LRU│ ├─ 用户会话数据│ ├─ 最近文档访问│ └─ 浏览历史│└─ 否 → 是否有明显的热点数据?

鱼干的博客 1344

LRU最近最少使用的缓存

实现思路,在LRU缓存类中维护一个Node的内部类,和一个缓存Map,实现每一个value就是一个Entry,entry之间是双向链表的关系,在链表之间加入head,和tail的entry节点,所有的数据节点都是在这两个之间进行的插入和查询。通过传入的指定的一个key,获取到对应的节点Entry,如何获取到的节点为null的话就是没有此节点,返回-1即可。的方法就比较麻烦了,通过key获取到节点node,此节点不为空,就说明缓存中具有此节点,更新此节点的value,将此节点移动到头部,返回即可。

qq_46724069的博客 580

java实现LRU、FIFO缓存

1、LRU缓存 1)LRU缓存的思想: 固定缓存大小,需要给缓存分配一个固定的大小。 每次读取缓存都会改变缓存的使用时间,将缓存的存在时间重新刷新。 需要在缓存满了后,将最近最久未使用的缓存删除,再添加最新的缓存。 2)LRU缓存实现: 通过一个map和双向链表实现: map:用来存储、检索缓存数据数据(效率高) 双向链表:用来记录访问顺序(链表方便将一个元素快速移动到头、尾、删除)...

赶路人儿 556

两种常见的缓存淘汰算法 LFU 和 LRU

LFU 1.1. 原理 LFU(Least Frequently Used)算法根据数据的历史访问频率来淘汰数据,其核心思想是“如果数据过去被访问多次,那么将来被访问的频率也更高”。 1.2. 实现 LFU的每个数据块都有一个引用计数,所有数据块按照引用计数排序,具有相同引用计数的数据块则按照时间排序。 具体实现如下: 新加入数据插入到队列尾部(因为引用计数为1); 队列中的数据被访问后,引用计数增加,队列重新排序; 当需要淘汰数据时,将已经排序的列表最后的数据块删除。 1.3. 分析 l

RayPick的博客 1968

LRU缓存策略Java实现

LRU(Least RecentlyUsed,最近最少使⽤)是⼀种缓存算法,其核⼼思想是将最近最少使⽤的缓存项移除,以便为更常⽤的缓存项腾出空间。

weixin_44591233的博客 473
上一篇: 将博客搬至优快云
下一篇: 海量数据获取TopK、堆排序,快速排序实现
anhooo
博客等级 码龄11年 3粉丝 35原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值