jdk1.8 LinkedHashMap原理_jdk1.8 linkedhashmap原理-程序员宅基地

技术标签: JAVA  LinkedHashMap  

LinkedHashMap

HashMap和双向链表合二为一即是LinkedHashMap。所谓LinkedHashMap,其落脚点在HashMap,因此更准确地说,它是一个将所有Entry节点链入一个双向链表的HashMap。由于LinkedHashMap是HashMap的子类,所以LinkedHashMap自然会拥有HashMap的所有特性。比如,LinkedHashMap的元素存取过程基本与HashMap基本类似,只是在细节实现上稍有不同。当然,这是由LinkedHashMap本身的特性所决定的,因为它额外维护了一个双向链表用于保持迭代顺序。

特点

  • key和value都允许为空
  • key重复会覆盖,value可以重复
  • 有序的(双向链表来维护顺序性)
  • LinkedHashMap是非线程安全的

 

LinkedHashMap结构图:

LinkedHashMap的实现主要分两部分,一部分是哈希表,另外一部分是链表(双向)哈希表部分(有个别方法重写了)继承了HashMap,拥有了HashMap那一套高效的操作,而链表保证对哈希表迭代时的有序性,而这个有序是指键值对插入的顺序(默认)。另外,当向哈希表中重复插入某个键的时候,不会影响到原来的有序性。所以我们要看的就是LinkedHashMap中链表的部分,了解它是如何来维护有序性的。

LinkedHashMap 的大致实现如下图所示,当然链表和哈希表中相同的键值对都是指向同一个对象,这里把它们分开来画只是为了呈现出比较清晰的结构。

          

从上图中可以看出,LinkedHashMap其实就是一个哈希表(HashMap)和一个双向链表构成的。说下这个双向链表吧,这个链表只是维护了键值对的插入顺序。比如先插入(k1,v1) 简称a,再插入(k2,v2)简称b,  那么a就是头(head),如果b是最后一个,那b就是tail(最后一个插入的是tail)。那a.after就指向b,b.before指向a。  before、after、tail、head后面会提到。

accessOrder变量的值决定了该LinkedHashMap插入顺序有序还是按访问顺序有序。accessOrder默认false是按插入顺序有序,为true是按访问顺序有序,下面介绍构造方法会说这个参数

LinkedHashMap接口

public class LinkedHashMap<K,V> extends HashMap<K,V> implements Map<K,V>{...}

LinkedHashMap构造函数

   public LinkedHashMap(int initialCapacity, float loadFactor) {
        super(initialCapacity, loadFactor);
        accessOrder = false;
    }

    public LinkedHashMap(int initialCapacity) {
        super(initialCapacity);
        accessOrder = false;
    }

    public LinkedHashMap() {
        //调用HashMap的无参构造方法  默认长度也是16  负载因子也是0.75
        super();
        //false表示按put的先后排序,true表示按访问的顺序排序
        accessOrder = false;
    }

    public LinkedHashMap(Map<? extends K, ? extends V> m) {
        super();
        accessOrder = false;
        putMapEntries(m, false);
    }

    public LinkedHashMap(int initialCapacity,float loadFactor,boolean accessOrder) {
        super(initialCapacity, loadFactor);
        this.accessOrder = accessOrder;
    }

LinkedHashMap存储数据是有序的,而且分为两种:插入顺序和访问顺序。这里accessOrder设置为false,表示LinkedHashMap中存储的顺序是按照调用put方法插入的顺序进行排序的。LinkedHashMap提供了5种构造函数,其中有四个构造函数的accessOrder默认是为false,还有一种可以设置accessOrder的构造方法,我们来look下这个构造方法

可以看出accessOrder为true,是按访问顺序有序,也就是被访问的元素被移动到双向链表的末尾。

init 方法(JDK1.6)

  从上面的五种构造函数我们可以看出,无论采用何种方式

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_35044419/article/details/116004324

智能推荐

JRebel热部署 xml文件修改 sql文件修改 不生效_jrebel 不更新sql-程序员宅基地

文章浏览阅读3.2k次。JRebel热部署 xml文件修改 sql文件修改 不生效_jrebel 不更新sql

论文学习笔记 POSEIDON: Privacy-Preserving Federated Neural Network Learning_poseidon: privacypreserving federated neural netwo-程序员宅基地

文章浏览阅读1.6k次,点赞6次,收藏14次。论文学习笔记 POSEIDON: Privacy-Preserving Federated Neural Network LearningNDSS 2021录用文章目录论文学习笔记 POSEIDON: Privacy-Preserving Federated Neural Network Learning一、机器学习1. 机器学习(ML)中的挑战2. 隐私保护机器学习(PPML)二、POSEIDON方案1. 系统和威胁模型2. 方案总览多方同态加密(MHE)联邦学习主要挑战和解决方法3. 方案CKKS_poseidon: privacypreserving federated neural network learning

opentsdb远程代码执行(CVE-2020-35476)-程序员宅基地

文章浏览阅读1.9k次。1漏洞背景OpenTSDB(Open Time Series Data Base)是基于HBASE构建的分布式、可扩展的时间序列数据库。OpenTSDB可以获取电力行业、化工行业、物联网行业等各类型实时监测、检查与分析设备所采集、产生的时间序列数据,并提供存储、索引以及图形化服务,使其易于访问和可视化。2 漏洞原理OpenTSDB 2.4.0及之前版本中存在远程代码执行漏洞,用户提交的yrange参数或其他相关参数的值在/src/tsd/GraphHandler.java文件中进行简单的反引号._cve-2020-35476

警惕rapidxml的陷阱(二):在Android上默认内存池分配数组过大,容易导致栈溢出_an element node. name contains element name. value-程序员宅基地

文章浏览阅读995次。项目中我们的模块很快写好了,在windows和linux上测试都工作的很好,但在Android上有时候却会崩溃。背景:我们的模块是c++写的,编译成so动态库在不同的平台(linux,windows,Android)上运行;Android上我们包装了一个service,通过jni加载so动态库运行的。 解决程序崩溃问题,首先要找到崩溃点。但我们的程序是service+jni的形式,直接_an element node. name contains element name. value contains text of first da

6.4.3 Xacro_完整使用流程示例_ros6.4-程序员宅基地

文章浏览阅读628次,点赞3次,收藏4次。ROS入门 6.4.3 Xacro_完整使用流程示例《ROS入门-理论与实践》视频教程镇楼》需求描述:使用 Xacro 优化 URDF 版的小车底盘模型实现结果演示:1.编写 Xacro 文件<!-- 使用 xacro 优化 URDF 版的小车底盘实现: 实现思路: 1.将一些常量、变量封装为 xacro:property 比如:PI 值、小车底盘半径、离地间距、车轮半径、宽度 .... 2.使用 宏 封装驱动轮以及支撑轮实现,调用相关_ros6.4

C++BUG: [Error] invalid array assignment-程序员宅基地

文章浏览阅读2.4w次,点赞11次,收藏32次。C++BUG: [Error] invalid array assignment1. Introduction2. memcpy()函数原型功能头文件返回值与strcpy的区别实例1. Introduction在使用数组给数组赋值时,会出现以上bug。大致的栗子如下:while(!student.eof()){ SS[j].name=stud.name;//报错! SS[j].ID=stud.ID; SS[j].score=stud.score; _invalid array assignment

随便推点

ArcGIS API for JavaScript——地图展示分享-程序员宅基地

文章浏览阅读363次,点赞8次,收藏9次。https://zhuanlan.zhihu.com/p/93662287

音频特征提取——pyAudioAnalysis工具包-程序员宅基地

文章浏览阅读4.4k次。转载:http://www.cnblogs.com/xingshansi/p/6806637.html前言语音识别等应用离不开音频特征的提取,最近在看音频特征提取的内容,用到一个python下的工具包——pyAudioAnalysis: An Open-Source Python Library for Audio Signal Analysis,该工具包的说明文档可以点击这里下载,对应的gith..._pyaudioanalysis

LaTeX数学符号大全_latex 数学符号-程序员宅基地

文章浏览阅读10w+次,点赞407次,收藏1.6k次。本篇博文介绍一些常用的LaTeX符号,方便使用时查询。文章目录1.操作符2.关系符3.希腊字母小写大写4.箭头5.点6.上标7.其他8.命令符9.跨行或跨列的符号:1.操作符SymbolCommandSymbolCommandSymbolCommand±\pm±\pm∓\mp∓\mp×\times×\times÷\div÷\div⋅\cdot⋅..._latex 数学符号

Spring Security ,Spring Actuator添加登录认证_spring security actuator-程序员宅基地

文章浏览阅读3.7k次。一、继承WebSecurityConfigurerAdapter@Configuration(proxyBeanMethods = false)public class ActuatorSecurity extends WebSecurityConfigurerAdapter {}二、 配置限制1. 不认证@Overrideprotected void configure(HttpSecurity http) throws Exception { ..._spring security actuator

java调用shell命令并获取执行结果_java执行shell命令 结果正常但实际没有执行-程序员宅基地

文章浏览阅读1.3w次。使用到Process和Runtime两个类,返回值通过Process类的getInputStream()方法获取[plain] view plain copypackage ark; import java.io.BufferedReader; import java.io.IOException; import java._java执行shell命令 结果正常但实际没有执行

Oracle:like 模糊匹配的漏洞_oracle两个字段模糊匹配like-程序员宅基地

文章浏览阅读463次。Oracle like运算符通常在数据量不高的情况下,用于where表达式中,搜索匹配字段中的指定内容,一般和 % 或 _ 结合使用。如下查询user表中name字段含有 小白龙 的数据:SELECT * FROM user WHERE name LIKE '%小白龙%';但是使用like查询%时,因为%为通配符会被忽略,以致查询所有数据。解决方法:使用instr查询替换like查询。在数据量大的情况下,查询速度也更快。SELECT * FROM user WHERE instr(name, _oracle两个字段模糊匹配like