再探Java集合系列—LinkedHashMap

LinkedHashMap 继承了 HashMap

所以LinkedHashMap也是一种k-v的键值对,并且内部是双链表的形式维护了插入的顺序

LinkedHashMap如何保证顺序插入的?

在HashMap中时候说到过HashMap插入无序的

LinkedHashMap使用了双向链表,内部的node节点包含了分别指向前驱和后驱的before和after两个指针

LinkedHashMap的特点有哪些?

  • 可以维持插入顺序
  • 保证访问顺序,通过构造函数可以设置LinkedHashMap的访问顺序,采用了LRU算法(保证最近访问的元素都在链表的末尾

底层原理

插入元素

在使用debug去put元素的时候会发现调用了HashMap的put方法,由于LinkedHashMap继承了HashMap,内部会调用put方法,

但他们的实现逻辑不相同。不同点在于调用的newNode(int hash, K key, V value, Node<K,V> e)方法不同,LinkedHashMap会调用自己内部的newNode方法

LinkedHashMap添加了双向链表去维护节点和节点之间的前后映射关系,添加了Node节点。通过源码我们发现在创建新节点的时候同步的也会创建before和after两个分别指向前驱节点和后驱节点的指针,这样保证了节点和节点之间相互之间能够非常明确


查找元素

通过get方法访问指定key,在debug断点调试的过程中发现代码并没有执行第二个if判断里的逻辑,这是为什么呢?什么时候accessOrder会为true呢?accessOrder的作用是什么?

其实我们还通过构造函数可以设置LinkedHashMap的访问顺序,其内部采用了LRU算法(最近最久未使用),每次被get的元素会放在集合的末尾,保证最近访问的元素都在链表的末尾。那怎么开启这项功能呢?

如下图,在创建LinkedHashMap对象的时候可以定义设置初始容量、加载因子以及开启顺序访问,当对象初始化成功之后accessOrder就被置为true,

上述中afterNodeAccess方法的作用是什么呢?是在访问节点后,将节点移动到链表的尾部,此时在get元素之后我们在输出集合发现顺序改变了。

删除元素和修改元素和LinkedList原理相同,修改指针的指向并且置删除位置为null

如果有想要交流的内容欢迎在评论区进行留言,如果这篇文档受到了您的喜欢那就留下你点赞+收藏+评论脚印支持一下博主~

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

YOLOv8改进 | 2023 | 通过RFAConv重塑空间注意力(深度学习的前沿突破)

一、本文介绍 本文给大家带来的改进机制是RFAConv&#xff0c;全称为Receptive-Field Attention Convolution&#xff0c;是一种全新的空间注意力机制。与传统的空间注意力方法相比&#xff0c;RFAConv能够更有效地处理图像中的细节和复杂模式(适用于所有的检测对象都有一定的…

Embedding压缩之hash embedding

在之前的两篇文章 CTR特征重要性建模&#xff1a;FiBiNet&FiBiNet模型、CTR特征建模&#xff1a;ContextNet & MaskNet中&#xff0c;阐述了特征建模的重要性&#xff0c;并且介绍了一些微博在特征建模方面的研究实践&#xff0c;再次以下面这张图引出今天的主题&#…

电子学会C/C++编程等级考试2023年03月(三级)真题解析

C/C++等级考试(1~8级)全部真题・点这里 第1题:和数(2023.3) 给定一个正整数序列,判断其中有多少个数,等于数列中其他两个数的和。 比如,对于数列1 2 3 4, 这个问题的答案就是2, 因为3 = 2 + 1, 4 = 1 + 3。 时间限制:10000 内存限制:65536输入 共两行,第一行是数列中…

开发中遇到的问题 -- 回调解决应用端和服务端通信问题

前言 这是我在这个网站整理的笔记,有错误的地方请指出&#xff0c;关注我&#xff0c;接下来还会持续更新。 作者&#xff1a;神的孩子都在歌唱 这里写目录标题 一. 问题概述二. 代码展示2.1 公共服务端2.2 应用端 一. 问题概述 项目介绍&#xff1a;今天做项目的时候遇到了点…

STM32---时钟树

写在前面&#xff1a;一个 MCU 越复杂&#xff0c;时钟系统也会相应地变得复杂&#xff0c;如 STM32F1 的时钟系统比较复杂&#xff0c;不像简单的 51 单片机一个系统时钟就 可以解决一切。对于 STM32F1 系列的芯片&#xff0c;其有多个时钟源&#xff0c;构成了一个庞大的是时…

go学习之json和单元测试知识

文章目录 一、json以及序列化1.概述2.json应用场景图3.json数据格式说明4.json的序列化1&#xff09;介绍2&#xff09;应用案例 5.json的反序列化1&#xff09;介绍2&#xff09;应用案例 二、单元测试1.引子2.单元测试-基本介绍3.代码实现4.单元测试的细节说明5.单元测试的综…

05、基于梯度下降的协同过滤算法

05、基于梯度下降的协同过滤算法理论与实践Python 开始学习机器学习啦&#xff0c;已经把吴恩达的课全部刷完了&#xff0c;现在开始熟悉一下复现代码。对这个手写数字实部比较感兴趣&#xff0c;作为入门的素材非常合适。 协同过滤算法是一种常用的推荐算法&#xff0c;基于…

通过C#获取Windows设置的夏令时开关

C#获取Windows夏令时开关 // 获取所有的时区信息 var allTimeZones TimeZoneInfo.GetSystemTimeZones().ToList();通过接口可以看到, 字段SupportsDaylightSavingTime代表是否支持配置夏令时 // 获取当前Window设置的时区 var tmpLocal TimeZoneInfo.Local;但是取Local 信息…

leetCode 78.子集 + 回溯算法 + 图解

给你一个整数数组 nums &#xff0c;数组中的元素 互不相同 。返回该数组所有可能的子集&#xff08;幂集&#xff09;。解集 不能 包含重复的子集。你可以按 任意顺序 返回解集 示例 1&#xff1a; 输入&#xff1a;nums [1,2,3] 输出&#xff1a;[[],[1],[2],[1,2],[3],[1…

Python之学生信息管理系统

目录 一、基础界面实现 1、主函数 2、保持循环&#xff0c;获取用户需求 二、函数实现模块功能 1、添加学生信息 2、删除学生信息 3、修改学生信息 4、查找全部学生信息 5、退出系统 三、整合代码 1、 完整代码 2、完整实现过程 实现 打印功能菜单、添加学生信息、删…

注解方式优雅的实现Redisson分布式锁

1.前言 随着微服务的快速推进&#xff0c;分布式架构也得到蓬勃的发展&#xff0c;那么如何保证多进程之间的并发则成为需要考虑的问题。因为服务是分布式部署模式&#xff0c;本地锁Reentrantlock和Synchnorized就无法使用了&#xff0c;当然很多同学脱口而出的基于Redis的se…

使用canvas实现代码雨高级升阶版【附带源码和使用方法】

文章目录 前言基本绿色的彩色版本飘散雪花状后言 前言 hello world欢迎来到前端的新世界 &#x1f61c;当前文章系列专栏&#xff1a;前端面试 &#x1f431;‍&#x1f453;博主在前端领域还有很多知识和技术需要掌握&#xff0c;正在不断努力填补技术短板。(如果出现错误&…