Java集合之LinkedHashMap源码分析
概述
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源码分析相关推荐
- 死磕 java集合之ArrayDeque源码分析
问题 (1)什么是双端队列? (2)ArrayDeque是怎么实现双端队列的? (3)ArrayDeque是线程安全的吗? (4)ArrayDeque是有界的吗? 简介 双端队列是一种特殊的队列,它的 ...
- 【死磕 Java 集合】— LinkedTransferQueue源码分析
[死磕 Java 集合]- LinkedTransferQueue源码分析 问题 (1)LinkedTransferQueue是什么东东? (2)LinkedTransferQueue是怎么实现阻塞队 ...
- 死磕Java集合之BitSet源码分析(JDK18)
死磕Java集合之BitSet源码分析(JDK18) 文章目录 死磕Java集合之BitSet源码分析(JDK18) 简介 继承体系 存储结构 源码解析 属性 构造方法 set(int bitInde ...
- java arraydeque_死磕 java集合之ArrayDeque源码分析
问题 (1)什么是双端队列? (2)ArrayDeque是怎么实现双端队列的? (3)ArrayDeque是线程安全的吗? (4)ArrayDeque是有界的吗? 简介 双端队列是一种特殊的队列,它的 ...
- java ee是什么_死磕 java集合之HashSet源码分析
问题 (1)集合(Collection)和集合(Set)有什么区别? (2)HashSet怎么保证添加元素不重复? (3)HashSet是否允许null元素? (4)HashSet是有序的吗? (5) ...
- Java集合:Hashtable源码分析
1. 概述 上次讨论了HashMap的结构,原理和实现,本文来对Map家族的另外一个常用集合HashTable进行介绍.HashTable和HashMap两种集合非常相似,经常被各种面试官问到两者的区 ...
- 死磕 java集合之ConcurrentSkipListMap源码分析——发现个bug
前情提要 点击链接查看"跳表"详细介绍. 拜托,面试别再问我跳表了! 简介 跳表是一个随机化的数据结构,实质就是一种可以进行二分查找的有序链表. 跳表在原有的有序链表上面增加了多级 ...
- Java集合之Vector源码分析
概述 Vector与ArrayLIst类似, 内部同样维护一个数组, Vector是线程安全的. 方法与ArrayList大体一致, 只是加上 synchronized 关键字, 保证线程安全, 下面 ...
- Java集合干货——ArrayList源码分析
前言 在之前的文章中我们提到过ArrayList,ArrayList可以说是每一个学java的人使用最多最熟练的集合了,但是知其然不知其所以然.关于ArrayList的具体实现,一些基本的都也知道,譬 ...
最新文章
- 理财工具——七大标准比率
- Flask框架(flask-script扩展命令行和flask中数据库migrate扩展的使用)
- 【刷题】LOJ 6011 「网络流 24 题」运输问题
- ssl1104-USACO 2.1城堡(foodfill)【图论,广搜】
- 3.2 Tensorflow基础运算
- opencv2.4.7.2画圆,画十字,画矩形
- Android ROM 制作教程
- 红米k20pro短接9008,红米k20pro短接9008_小米、红米全系列短接点拆机进入9008模式刷机图解方法...
- 现在很迷茫,完全不知道自己能干什么
- hp linux 禁用u盘启动不了,u盘启动禁用旧版启动模式并启用UEFI
- 用 Python 快速追踪基金的收益情况 | Python财经实践
- 翟菜花:以科创板的科技成色,错失联想是相当大的损失
- RabbitMQ Tracing插件使用
- 2018百度沸点国人年度榜单出炉
- win32的BitBlt和StretchBlt
- 使用mysqladmin检测MySQL运行状态的教程
- 小程序实现图片的浏览,缩放大小
- IDEA中插件加载不出来问题解决
- 2021年中国轿车行业现状分析,产销量回升,行业逐渐回暖「图」
- Yolov5可以看到虽然有结果图片,但是并没有框出识别结果
热门文章
- 砥志研思SVM(四) 序列最小最优化算法(SMO)论文翻译
- cifs挂载 mount ubuntu_centos或者Ubuntu挂载windows10文件夹
- 创新, FMA SMA 世界第一台VCD机的故事
- stm32程序怎么设置apb2总线时钟_stm32学习笔记
- 数据库新增幂等操作_使用数据库唯一键实现事务幂等性
- 宽量程电压电流 stm32_电压、电阻知识点汇总
- IOC容器(底层原理解读)
- JAVA入门级教学之(方法-4)
- java中大数字表示什么_JAVA中大数字的的处理:BigInteger和BigDecimal
- update关联一个视图的时候特别慢_实现一个简单的Vue.js