概述

HashMap是无序的, 即put的顺序与遍历顺序不保证一样.

LinkedHashMap是HashMap的一个子类, 它通过重写父类的相关方法, 实现自己的功能. 它保留插入的顺序. 如果需要输出和输入顺序相同时, 就选用此类.

LinkedHashMap原理

LinkedHashMap是如何保证输入输出顺序的呢?

LinkedHashMap重写了 HashMap 的Entry元素, 该Entry额外保存了上一个元素与下一个元素的引用, 从而在哈希表的基础上又构成了双向链表, 源码:

这个链表维护了一个双向链表, 用于保存顺序.

用于指定按照什么顺序来维护链表:

1.构造函数

其构造函数就是调用HashMap的构造函数. 在HashMap的构造函数中, 会调用 init() 方法(在介绍HashMap时介绍过), LindedHashMap 重写init()方法, 在init()方法中进行相关初始化.

2.存储

LinkedHashMap并没有重写父类的put方法, 而是重写了父类put方法中调用的其他方法来实现自己的功能, 父类put方法如下:

LindedHashMap重写的方法如下:

3.读取

LinkedHashMap重写了父类的get方法:

实际在调用父类getEntry方法取得查找的元素后, 在判断是否记录访问顺序. 由于链表的添加、删除操作都是常量级的, 不会带来性能的损失.

4.排序模式

LindedHashMap定义了 boolean 型变量 accessOrder, 若为true, 按照访问顺序排序, 若为false, 按照插入顺序排序. 默认为 false;


其实LinkedHashMap几乎和HashMap一样, 只是LinkedHashMap定义了一个 Entry元素header, 通过header中的before,after和header结合建立一个双向链表, 用来实现元素的顺序.

Java集合之LinkedHashMap源码分析相关推荐

  1. 死磕 java集合之ArrayDeque源码分析

    问题 (1)什么是双端队列? (2)ArrayDeque是怎么实现双端队列的? (3)ArrayDeque是线程安全的吗? (4)ArrayDeque是有界的吗? 简介 双端队列是一种特殊的队列,它的 ...

  2. 【死磕 Java 集合】— LinkedTransferQueue源码分析

    [死磕 Java 集合]- LinkedTransferQueue源码分析 问题 (1)LinkedTransferQueue是什么东东? (2)LinkedTransferQueue是怎么实现阻塞队 ...

  3. 死磕Java集合之BitSet源码分析(JDK18)

    死磕Java集合之BitSet源码分析(JDK18) 文章目录 死磕Java集合之BitSet源码分析(JDK18) 简介 继承体系 存储结构 源码解析 属性 构造方法 set(int bitInde ...

  4. java arraydeque_死磕 java集合之ArrayDeque源码分析

    问题 (1)什么是双端队列? (2)ArrayDeque是怎么实现双端队列的? (3)ArrayDeque是线程安全的吗? (4)ArrayDeque是有界的吗? 简介 双端队列是一种特殊的队列,它的 ...

  5. java ee是什么_死磕 java集合之HashSet源码分析

    问题 (1)集合(Collection)和集合(Set)有什么区别? (2)HashSet怎么保证添加元素不重复? (3)HashSet是否允许null元素? (4)HashSet是有序的吗? (5) ...

  6. Java集合:Hashtable源码分析

    1. 概述 上次讨论了HashMap的结构,原理和实现,本文来对Map家族的另外一个常用集合HashTable进行介绍.HashTable和HashMap两种集合非常相似,经常被各种面试官问到两者的区 ...

  7. 死磕 java集合之ConcurrentSkipListMap源码分析——发现个bug

    前情提要 点击链接查看"跳表"详细介绍. 拜托,面试别再问我跳表了! 简介 跳表是一个随机化的数据结构,实质就是一种可以进行二分查找的有序链表. 跳表在原有的有序链表上面增加了多级 ...

  8. Java集合之Vector源码分析

    概述 Vector与ArrayLIst类似, 内部同样维护一个数组, Vector是线程安全的. 方法与ArrayList大体一致, 只是加上 synchronized 关键字, 保证线程安全, 下面 ...

  9. Java集合干货——ArrayList源码分析

    前言 在之前的文章中我们提到过ArrayList,ArrayList可以说是每一个学java的人使用最多最熟练的集合了,但是知其然不知其所以然.关于ArrayList的具体实现,一些基本的都也知道,譬 ...

最新文章

  1. 理财工具——七大标准比率
  2. Flask框架(flask-script扩展命令行和flask中数据库migrate扩展的使用)
  3. 【刷题】LOJ 6011 「网络流 24 题」运输问题
  4. ssl1104-USACO 2.1城堡(foodfill)【图论,广搜】
  5. 3.2 Tensorflow基础运算
  6. opencv2.4.7.2画圆,画十字,画矩形
  7. Android ROM 制作教程
  8. 红米k20pro短接9008,红米k20pro短接9008_小米、红米全系列短接点拆机进入9008模式刷机图解方法...
  9. 现在很迷茫,完全不知道自己能干什么
  10. hp linux 禁用u盘启动不了,u盘启动禁用旧版启动模式并启用UEFI
  11. 用 Python 快速追踪基金的收益情况 | Python财经实践
  12. 翟菜花:以科创板的科技成色,错失联想是相当大的损失
  13. RabbitMQ Tracing插件使用
  14. 2018百度沸点国人年度榜单出炉
  15. win32的BitBlt和StretchBlt
  16. 使用mysqladmin检测MySQL运行状态的教程
  17. 小程序实现图片的浏览,缩放大小
  18. IDEA中插件加载不出来问题解决
  19. 2021年中国轿车行业现状分析,产销量回升,行业逐渐回暖「图」
  20. Yolov5可以看到虽然有结果图片,但是并没有框出识别结果

热门文章

  1. 砥志研思SVM(四) 序列最小最优化算法(SMO)论文翻译
  2. cifs挂载 mount ubuntu_centos或者Ubuntu挂载windows10文件夹
  3. 创新, FMA SMA 世界第一台VCD机的故事
  4. stm32程序怎么设置apb2总线时钟_stm32学习笔记
  5. 数据库新增幂等操作_使用数据库唯一键实现事务幂等性
  6. 宽量程电压电流 stm32_电压、电阻知识点汇总
  7. IOC容器(底层原理解读)
  8. JAVA入门级教学之(方法-4)
  9. java中大数字表示什么_JAVA中大数字的的处理:BigInteger和BigDecimal
  10. update关联一个视图的时候特别慢_实现一个简单的Vue.js