LinkedHashMap顺序迭代原理与LRU算法实现

news2024/11/26 0:25:37

一、LinkedHashMap与HashMap的结构区别

HashMap
在这里插入图片描述
LinkedHashMap
在这里插入图片描述
在这里插入图片描述

结构区别:LinkedHashMap的元素Entry中多两个用于维护双向链表的指针before、after,并且在LinkedHashMap中有两个head、tail指针用于记录双向链表的头结点和尾结点。

二、LinkedHashMap顺序迭代原理

LinkedHashMap可保证通过keySet()、entrySet()、forEach()等方法获取的元素具有顺序性,顺序分为两种:

  • 添加顺序:获取元素的顺序与其被添加的顺序一致。
  • 访问顺序:按元素被访问的时间进行排序,越近被访问的排在越后面,put和get等方法都表示访问。

在LinkedHashMap通过成员变量accessOrder来决定按哪种顺序排序,默认为false添加顺序,只有通过下面这个构造方法在创建LinkedHashMap时将accessOrder设置为true,才表示访问顺序。

在这里插入图片描述

1. 添加顺序实现原理

添加顺序实现很简单,就是在按照HashMap规则添加元素后,还会执行一个方法将其添加到双向链表的尾部,然后更新尾结点tail。因此迭代时从双向链表head迭代到tail即为访问顺序。

2. 访问顺序实现原理

put添加元素后依然会将其添加到双向链表的尾部,表示是最近被访问到的。但是如果accessOrder为true,那么在下面这些访问方法中都会调用afterNodeAccess()将被访问元素移动到双向链表的尾部。因此在双向链表中就实现了元素的访问顺序。

在这里插入图片描述

三、LinkedHashMap实现LRU算法

在LinkedHashMap中还有一个钩子方法removeEldestEntry(),在插入元素后调用的afterNodeInsertion()方法中会调用这个方法,如果它返回true那么就会移除Map中最老的元素即head,在添加顺序中head就是最早添加的元素,在访问顺序中head就是最长时间没被访问的元素。

在这里插入图片描述

因此我们可以重写钩子方法removeEldestEntry(),来利用LinkedHashMap实现LRU算法(LeetCode链接):

public class LRUCache {

    private final LinkedHashMap<Integer, Integer> map;
    private final int capacity;

    public LRUCache(int capacity) {
        this.capacity = capacity;
        //1、选用可设置accessOrder的构造函数
        //2、重写removeEldestEntry()方法,在插入元素后若size大于容量,则返回true,移除最长时间没被访问的元素
        map = new LinkedHashMap<Integer, Integer>(capacity+1, 0.75f, true) {
            @Override
            protected boolean removeEldestEntry(Map.Entry eldest) {
                return size() > capacity;
            }
        };
    }

    public int get(int key) {
        try {
            return map.get(key);
        } catch (Exception e) {
            return -1;
        }
    }

    public void put(int key, int value) {
        map.put(key, value);
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2.3 定点乘法运算

学习目标&#xff1a; 如果我要学习定点乘法运算&#xff0c;我会按照以下步骤进行学习&#xff1a; 确定学习目标&#xff1a;明确学习定点乘法运算的目的和重点&#xff0c;以便有针对性地进行学习。 掌握基础知识&#xff1a;首先需要了解定点数和定点乘法的基础知识&…

【halcon】半透明和棋盘格(未完成)

背景 想实现一个这样的效果&#xff1a; 但是发现设置HSmartWindowControlWPF 的Background 根本就没有反应。 探索过程 于是就换个思路&#xff0c;把棋盘格画到Border里面。 <Border Grid.Row"1" Grid.ColumnSpan"2" Panel.ZIndex"0" >…

MySQL:数据库的基本操作

MySQL是一个客户端服务器结构的程序, 一.关系型数据库 关系型数据库是一个结构化的数据库&#xff0c;创建在关系模型&#xff08;二维表格模型&#xff09;基础上&#xff0c;一般面向于记录。 主流的关系型数据库包括 Oracle、MySQL、SQL Server、Microsoft Access、DB2 等. …

mitmproxy抓包

0.mitmproxy功能简介 实时拦截、修改 HTTP/HTTPS 请求和响应可保存完整的 http 会话&#xff0c;方便后续分析和重放支持反向代理模式将流量转发到指定服务器支持 macOS 和 Linux上的透明代理模式支持用 Python 脚本对 HTTP 通信进行修改 1. 安装mitmproxy pip3 install mit…

wow.js scrollReveal.js 动画库 使用详解以及优劣

wow.js 1.简介 有的页面在向下滚动的时候&#xff0c;有些元素会产生细小的动画效果。比如需要做到滚动条滑到某个位置时&#xff0c;才能显示动画。wow.js 依赖 animate.css&#xff0c;所以它支持 animate.css 多达 60 多种的动画效果&#xff0c;能满足您的各种需求。 IE6、…

Python+Qt掌纹识别

程序示例精选 PythonQt掌纹识别 如需安装运行环境或远程调试&#xff0c;见文章底部个人QQ名片&#xff0c;由专业技术人员远程协助&#xff01; 前言 这篇博客针对<<PythonQt掌纹识别>>编写代码&#xff0c;代码整洁&#xff0c;规则&#xff0c;易读。 学习与应…

安卓GB28181-2022 RTP over TCP

使用TCP传输RTP包&#xff0c;GB28181-2016和GB28181-2022 都是按IETF RFC4571来的。使用TCP发送RTP包&#xff0c;前面加个16位无符号长度字段就好(网络字节序)。具体定义格式如下&#xff1a; 需要注意的是LENGTH值可以是0&#xff0c;0的话表示空包; 另外UDP传输RTP包&#…

【华为云主机迁移服务SMS,使用指南 (linux版本)】

文章目录 华为云主机迁移服务SMS,使用指南 (linux版本)1.迁移前准备工作1.1 必要条件1.2 准备 (注意切换浏览器) 2.在源端(A服务器)安装Agent (linux版), 连接到B的华为云SMS3.设置目的端(B服务器)--在B浏览器内操作4.开始服务器复制5.启动目的端 (B)6.其他非必要操作 华为云主…

KDZD地埋线短路漏电试扎器

一、产品背景 多年以来&#xff0c;电力电缆的维护迁移过程中的识别与刺孔&#xff0c;均按照行业标准DL409-91《电业安全工作规程&#xff08;电力线路部分&#xff09;》第234条要求&#xff0c;采用人工刺孔&#xff0c;一旦电缆识别出错&#xff0c;误刺孔带电电缆将对人身…

就现在!体验高科技的虚拟孪生

01 行业创新已成大势所趋 世界进入工业复兴大约已有十余载&#xff0c;众多行业开始向数字化转型&#xff0c;尖端技术取代了老旧的数字技术。对于制造商而言&#xff0c;在将运营控制在预算范围内的同时&#xff0c;保持满足这些需求所需的产量&#xff0c;是一项巨大的挑战。…

JS-11G/11端子排静态时间继电器 JOSEF约瑟 导轨安装

JS-11G系列端子排静态时间继电器品牌&#xff1a;JOSEF约瑟名称&#xff1a;端子排静态时间继电器型号&#xff1a;JS-11G工作电压&#xff1a;48,110,220V返回时间&#xff1a;≤20mS延时范围&#xff1a;0.02S~999M 系列型号&#xff1a; JS-11G1端子排静态时间继电器&…

【英语】2023 全国大学生英语竞赛NECCS相关准备

文章目录 1、比赛基本信息2、大赛题型和分值3、如何准备4、2023年全国大学生英语竞赛样题(C级)&#xff0c;满分150Part1. 听力&#xff08;30分钟&#xff0c;30分&#xff0c;1题1分&#xff09;Part2/3. 词语|语法&#xff0c;完型填空&#xff08;20分钟&#xff0c;25分&a…

《程序员面试金典(第6版)》面试题 16.07. 最大数值(移位 + 整形提升)

题目描述 编写一个方法&#xff0c;找出两个数字a和b中最大的那一个。不得使用if-else或其他比较运算符。 示例&#xff1a; 输入&#xff1a; a 1, b 2输出&#xff1a; 2 解题思路与代码 我真的觉得这道题很智障&#xff0c;但是你先别急。 这道题目的意义在于让你使用一…

老男孩读 pcie

之一1 2 RC的内部实现很复杂,PCIe Spec也没有规定RC该做什么,还是不该做什么。我们也不需要知道那么多,只需清楚:它一般实现了一条内部PCIe总线(BUS 0),以及通过若干个PCIe bridge,扩展出一些PCIe Port,如下图所示: PCIe Endpoint,就是PCIe终端设备,比如PCIe SSD…

Selenium:WebDriver简介及元素定位

目录 一、WebDriver原理 二、WebDriver定位方法 三、WebElement接口常用方法 一、WebDriver原理 1、关于WebDriver 设计模式&#xff1a;按照Server-Client的经典设计模式设计&#xff1b; Server端&#xff1a;即Remote Server&#xff08;远程服务器&#xff09;&#x…

@Autowired与@Resource原理知识点详解

文章目录 前言springIOC依赖注入的三种方式属性注入&#xff08;字段注入&#xff09;构造方法注入setter注入用哪个&#xff1f; Autowired实现原理 Resource实现原理结论 Autowired与Resource的不同来源不同参数不同使用不同装配顺序 前言 现在spring可以说是一统天下了&…

idea自带database连接mysql失败问题

idea2023.1版连接mysql失败 DBMS: MySQL (ver. 5.7.13) Case sensitivity: plainexact, delimitedexact Driver: MySQL Connector Java (ver. mysql-connector-java-5.1.47 ( Revision: fe1903b1ecb4a96a917f7ed3190d80c049b1de29 ), JDBC4.0) [08S01]Communications link fai…

【Python】漏斗模型--生成漏斗案例 Demo实例

文章目录 背景一、漏斗模型二、漏斗模型案例1. 电商购物流程2. AARRR模型 三、如何绘制漏斗模型&#xff1f;总结 背景 很早之前就知道漏斗模型&#xff0c;但没有做更多的了解和运用&#xff0c;后来对漏斗模型的了解稍加深入之后&#xff0c;觉得它不仅仅是一个模型&#xf…

优思学院:什么是快速改善方法(Kaizen Blitz)?

什么是快速改善方法&#xff08;Kaizen Blitz&#xff09;&#xff1f; Kaizen blitz是精益管理中的一种方法&#xff0c;指通过集中一段时间内的团队努力来实现快速改进的方法。 Kaizen是一个日语词汇&#xff0c;意为“改善”&#xff0c;是一种广泛应用于企业管理的哲学&a…

软考(中/高级)高频考点——进度管理

现在距离2023年上半年软考仅有一个多月时间了&#xff0c;相信很多考友都进入火热的备考状态了。 为了给备考的考友们减轻备考难点&#xff0c;小编特意为大家整理了软考&#xff08;中/高级&#xff09;的一些高频考点——进度管理&#xff0c;希望对正在备考软考的你有所帮助…