最新要闻
- 高三学生写永久请假条告别班主任:画面催泪
- 店家回应未开封饮品中有蟑螂:不可能出现蟑螂 全球讯息
- 全球滚动:注意!高考生这6样东西别发朋友圈
- 宫崎想乃(关于宫崎想乃介绍)_环球新消息
- 天天视点!津城高考“最后一课”:喊出自信 留下感动
- 世界热讯:东风着陆场准备就绪迎接航天员回家 科普:飞船改动越少越安全
- 天玑之王!vivo X100首发天玑9300:性能对标苹果A17
- 或信号错误!印度列车相撞事故已致死伤超千人:该国百列火车运行受影响 近乎崩溃_全球微头条
- 历史上姓赵的名人_姓赵的历史名人
- 环球速递!小狗进入美发店被店员装麻袋摔死 创始人:开除且永不录用
- 眼馋理想L9大火 丰田大汉兰达或年内国产:卖40多万你买不
- 每日速讯:www yisi520 cn
- 9年资深员工被暴雪开除 魔兽台词被指阴阳怪气CEO-环球速递
- 安卓用户纷纷逃离:越来越多人买iPhone的原因找到了!体验、成本成核心因素
- 天天视讯!老年代步车机动车道压实线撞汽车 家属不赔:要钱没有要命一条
- 重庆两江交汇现“鸳鸯锅”奇观 网友直呼一边麻辣一边清汤:专家释疑
手机
iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
- 警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- 男子被关545天申国赔:获赔18万多 驳回精神抚慰金
- 3天内26名本土感染者,辽宁确诊人数已超安徽
- 广西柳州一男子因纠纷杀害三人后自首
- 洱海坠机4名机组人员被批准为烈士 数千干部群众悼念
家电
LRU缓存与LinkedHashMap源码
今天再刷LeetCode时,遇到了第146题LRU缓存。题目如下:
请你设计并实现一个满足 LRU (最近最少使用) 缓存 约束的数据结构。实现 LRUCache 类:LRUCache(int capacity) 以 正整数 作为容量 capacity 初始化 LRU 缓存int get(int key) 如果关键字 key 存在于缓存中,则返回关键字的值,否则返回 -1 。void put(int key, int value) 如果关键字 key 已经存在,则变更其数据值 value ;如果不存在,则向缓存中插入该组 key-value 。如果插入操作导致关键字数量超过 capacity ,则应该 逐出 最久未使用的关键字。函数 get 和 put 必须以 O(1) 的平均时间复杂度运行。示例:输入["LRUCache", "put", "put", "get", "put", "get", "put", "get", "get", "get"][[2], [1, 1], [2, 2], [1], [3, 3], [2], [4, 4], [1], [3], [4]]输出[null, null, null, 1, null, -1, null, -1, 3, 4]解释LRUCache lRUCache = new LRUCache(2);lRUCache.put(1, 1); // 缓存是 {1=1}lRUCache.put(2, 2); // 缓存是 {1=1, 2=2}lRUCache.get(1); // 返回 1lRUCache.put(3, 3); // 该操作会使得关键字 2 作废,缓存是 {1=1, 3=3}lRUCache.get(2); // 返回 -1 (未找到)lRUCache.put(4, 4); // 该操作会使得关键字 1 作废,缓存是 {4=4, 3=3}lRUCache.get(1); // 返回 -1 (未找到)lRUCache.get(3); // 返回 3lRUCache.get(4); // 返回 4
如果大家有阅读过LinkedHashMap源码,就会明白,这题的解法跟LinkedHashMap源码一模一样。
(相关资料图)
大家应该经常使用HashMap,而LinkedHashMap 刚好就比 HashMap 多这一个功能就是有序。并且,LinkedHashMap的有序可以按两种顺序排列,一种是按照插入的顺序,一种是按照 读取的顺序。显然,这题便是LinkedHashMap中按照读取的顺序进行顺序排列。而其内部是靠 建立一个双向链表来维护这个顺序的,在每次插入、删除后,都会调用一个函数来进行 双向链表的维护。
其内部就是靠如下三个回调方法来维护这个双向链表:
void afterNodeAccess(Node p) { }其作用就是在访问元素之后,将该元素放到双向链表的尾巴处(所以这个函数只有在按照读取的顺序的时候才会执行),之所以提这个,是建议大家去看看,如何优美的实现在双向链表中将指定元素放入链尾!void afterNodeRemoval(Node p) { }其作用就是在删除元素之后,将元素从双向链表中删除,还是非常建议大家去看看这个函数的,很优美的方式在双向链表中删除节点!void afterNodeInsertion(boolean evict) { }这个才是我们题目中会用到的,在插入新元素之后,需要回调函数判断是否需要移除一直不用的某些元素!
以下是我对于afterNodeAccess、afterNodeRemoval、afterNodeInsertion的个人理解:
afterNodeAccess:
afterNodeRemoval:
afterNodeInsertion:
/** * 插入新节点才会触发该方法,因为只有插入新节点才需要内存 * 根据 HashMap 的 putVal 方法, evict 一直是 true * removeEldestEntry 方法表示移除规则, 在 LinkedHashMap 里一直返回 false * 所以在 LinkedHashMap 里这个方法相当于什么都不做 */void afterNodeInsertion(boolean evict) { // possibly remove eldest LinkedHashMap.Entry first; // 根据条件判断是否移除最近最少被访问的节点 if (evict && (first = head) != null && removeEldestEntry(first)) { K key = first.key; removeNode(hash(key), key, null, false, true); }}// 移除最近最少被访问条件之一,通过覆盖此方法可实现不同策略的缓存// LinkedHashMap是默认返回false的,我们可以继承LinkedHashMap然后复写该方法即可// 例如 LeetCode 第 146 题就是采用该种方法,直接 return size() > capacity;protected boolean removeEldestEntry(Map.Entry eldest) { return false;}
通过上述代码,我们就已经知道了只要复写 removeEldestEntry() 即可,而条件就是 map 的大小不超过 给定的容量,超过了就得使用 LRU 了!然后根据题目给定的语句构造和调用:其主要是两个构造方法,一个是继承 HashMap ,一个是可以选择 accessOrder 的值(默认 false,代表按照插入顺序排序)来确定是按插入顺序还是读取顺序排序。
//调用父类HashMap的构造方法。public LinkedHashMap() { super(); accessOrder = false;}// 这里的 accessOrder 默认是为false,如果要按读取顺序排序需要将其设为 truepublic LinkedHashMap(int initialCapacity, float loadFactor, boolean accessOrder) { super(initialCapacity, loadFactor); this.accessOrder = accessOrder;}
最后该题解法如下:
class LRUCache extends LinkedHashMap { int capacity=10; public LRUCache(int capacity) { super(capacity,0.75F,true); this.capacity=capacity; } public int get(int key) { return this.getOrDefault(key,-1); } public void put(int key, int value) { super.put(key,value); } @Override protected boolean removeEldestEntry(Map.Entry eldest) { return size()>capacity; }}
完美解决!
参考链接:https://leetcode.cn/problems/lru-cache/solution/yuan-yu-linkedhashmapyuan-ma-by-jeromememory/
关键词:
-
热点在线丨关于使用openssl命令-同时生成私钥与CSR-Certificate Signing Request的方法记录
这里笔者主要讲述如何生成一个CSR证书签名请求文件,方法过程可能有多
来源: LRU缓存与LinkedHashMap源码
天天热文:文心一言 VS 讯飞星火 VS chatgpt (30)-- 算法导论5.2 2题
热点在线丨关于使用openssl命令-同时生成私钥与CSR-Certificate Signing Request的方法记录
高三学生写永久请假条告别班主任:画面催泪
店家回应未开封饮品中有蟑螂:不可能出现蟑螂 全球讯息
全球滚动:注意!高考生这6样东西别发朋友圈
宫崎想乃(关于宫崎想乃介绍)_环球新消息
记录--手把手教你Vue+ECharts+高德地图API实现天气预报数据可视化|当前关注
天天视点!津城高考“最后一课”:喊出自信 留下感动
世界热讯:东风着陆场准备就绪迎接航天员回家 科普:飞船改动越少越安全
天玑之王!vivo X100首发天玑9300:性能对标苹果A17
或信号错误!印度列车相撞事故已致死伤超千人:该国百列火车运行受影响 近乎崩溃_全球微头条
每日快讯!北京西城区举办建筑工地防汛抢险应急救援演练
印度列车相撞事故已致120死超800伤 车头被撞扁:现场惨烈
今日热文:椰树集团首次回应直播风格争议:审美回归、主打真实自然
【天天新要闻】读改变未来的九大算法笔记02_数据库
九八年属什么(中国与十二地支相配以人出生年份的十二种动物)-即时焦点
新动态:当在浏览器中输入百度地址后,发生了什么?(计算机网络篇)
ASP.NET Core优雅的添加HealthCheck_快看点
第六章:分区_每日热点
VX自动刷步数脚本
Visual Studio如何使用自带“诊断工具” 世界微头条
RCEP对15个签署国全面生效|天天消息
比过山车刺激多了 女子体验菲律宾360度秋千:全程尖叫 每日快播
世界滚动:AMD显卡两大神技宣布半年了:还都是PPT!
全世界最大盗版网站死了!居然还和俄乌冲突有关-环球微资讯
IGN满分的神作终于出中文了!可我却高兴不起来
迪士尼公主电影真人与动画对比 你最喜欢哪一个?
左蓝微电子技术有限公司_左蓝-世界快报
世界速讯:下周市场的风险在哪里?
千兆网线接线定义标准_千兆网线做法图解 天天观察
蚌埠到南京的火车票时刻表(火车票时刻表)
南京启动江心洲生态岛试验区创建 通讯
《新型电力系统发展蓝皮书》发布:提出储能规模化布局应用等四大体系 焦点播报
云集(YJ.US)Q1净亏损同比收窄 盘前飙涨110%_当前热文
疑因节省开支 马斯克取消推特的“翻译”功能
峰学蔚来公司每周做四休三 为考研名师张雪峰规定
黑人女子不满遭解雇 向法院提起诉讼称涉嫌种族和性别歧视
B站正式会员数达到2.05亿 其日均活跃用户数为9370万
泸州老窖曝光全专利 为可制备粉末白酒旨在方便储存及运输
苹果首款无风扇笔记本被列为过时产品 发售仅有8年
为进步加强新兴技术领域发展 韩国将投资约5000亿推进其AI项目发展
出于安全考虑 尼康Z8将禁用第三方电池
江苏一学生网购巴掌块小石头作画 商家发来一块7斤重大石头
东海租赁拟向东营茂阳新能源开发有限公司借款4500万 借款利率6%-世界微速讯
ASP.NET Core MVC 从入门到精通之自动映射(一) 环球热闻
史上最贵“蹦迪票”!神秘买家8万拍下椰树直播间蹦迪权:1秒单价2698元
【环球时快讯】学习笔记——VMWare的使用和Windows的安装
【环球报资讯】鬼谷子劝世良言篇
Celery框架
19)事务 天天即时
我的第一个项目(十五) :完成数据保存功能(后端,改update)_当前关注
每日快讯!这个“六一”我们让爱与欢乐“童”行|咸宁市第十七小学开展首届艺术节活动
女孩发视频吐槽房东 称其安装5级能耗导致电费超标
“黄晓明救了我的手机”冲上微博热搜 感觉不如昆仑玻璃
69岁!赵雅芝晒新写真 气质优雅梦回白娘子:网友感慨这谁顶得住 环球速递
5月新能源销量分析:比亚迪“冠军”初显威 江湖再无“蔚小理”-世界头条
青春永驻 还能多活十年:天下真有如此好事?
泪目!老伴走后第二天浙大老教师又去捡垃圾了:为资助贫困学生
天天看点:美团单车怎么关锁还车视频(美团单车怎么关锁还车)
文心一言 VS 讯飞星火 VS chatgpt (29)-- 算法导论5.2 1题
世界速讯:人民银行营管部发文加强征信合规管理 要求对高发征信合规问题开展自查和整改
全球速看:身轻如燕玩光追 1080P甜品卡就选它!耕升RTX 4060 Ti踏雪显卡评测
每日热点:3D扫描效率剧增!NVIDIA新AI模型可将视频生成高精模型
实时焦点:vivo X100系列首发天玑9300:超大杯搭载骁龙8 Gen3
三地同时遭遇太罕见!专家谈辽宁龙卷风:持续30分钟较少见 世界讯息
支付宝“史诗级”更新!终于支持深色模式了:3步教你开启
真崎杏子r18_真崎杏子
linux 性能自我学习 ———— 不可中断进程和僵尸进程 [四]-今日热议
环球要闻:上交所:6月5日上市交易科创50ETF期权 涨跌幅参数适应性调整为20%
一辆最多2万元!多地发放购车补贴,6月买车真是好时机?_当前热门
商业力+公益心 正大广场K3H四周年童趣升级-今日关注
为求效率最大化:AI测试中将矛头指向人类操作者|每日简讯
司机倒车坠河万分紧急 路人一个个冲了过来:3分钟救起落水女子
一文了解摩尔线程MTT S70显卡!国产显卡最新大作-环球通讯
又一车企面临退市!市值蒸发98% 美国新造车也是一地鸡毛
深圳一公司员工因上完厕所不冲水被开除 网友一边倒支持:活该被开
学习笔记——软件、软件分类、软件测试、数据的形式与数制(进制之间的转化)_全球即时看
观速讯丨总结vue3 的一些知识点:Vue.js 条件语句
总结vue3 的一些知识点:Vue.js 安装
焦点资讯:网红经济学家转型带货 任泽平开卖生发油:曾炮轰苹果割韭菜
三星Galaxy S23系列再出新问题:这次是相机拍照模糊
每日消息!经济学家转型带货!任泽平卖生发油和酱香白酒
开车上高速竟让婴儿平躺副驾驶!理想汽车回应:非常危险 坚决反对|环球新视野
热点!5699元供不应求!moto razr 40 Ultra预售被抢购一空
海博早读|福建130多万中学生正面临这种健康危害
云原生第五周--k8s实战案例
环球快讯:ChatGPT 背后的英雄——AI芯片
世界快播:记录--让URL地址都变成了"ooooooooo"
利用jira及confluence的API进行批量操作(查找/更新/导出/备份/删除等)
Angular Google Charts教程_编程入门自学教程_菜鸟教程-免费教程分享 全球即时看
【天天新视野】财政系统组织申报2023年第二批专项债项目:13领域可用专项债作资本金
看点:商品日报(6月2日):市场风险偏好继续改善 玻璃涨停沪镍纯碱涨超4%
天天即时:《封神三部曲》首部即将上映:制作成本或为16.5亿元
如何拍出女朋友最美一面?OPPO Reno10 Pro+评测:长焦人像让直男也会拍照
今日关注:不到1斤重!宏碁蜂鸟迷你主机开卖:1499元起
安全带又出现问题!韩系豪华品牌捷尼赛思宣布召回G80、GV70等共计1602辆|环球最新
比亚迪西安工厂起火 现场浓烟滚滚!官方回应
当前短讯!什么可以防电脑辐射_什么防辐射
又双叒叕种草了新家装风格?AI帮你家居换装-全球今头条