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集合之LinkedHashMap源码分析
欢迎关注我的公众号"彤哥读源码",查看更多源码系列文章, 与彤哥一起畅游源码的海洋. 简介 LinkedHashMap内部维护了一个双向链表,能保证元素按插入的顺序访问,也能以访问 ...
- 死磕 java集合之LinkedHashSet源码分析
问题 (1)LinkedHashSet的底层使用什么存储元素? (2)LinkedHashSet与HashSet有什么不同? (3)LinkedHashSet是有序的吗? (4)LinkedHashS ...
- 死磕 java集合之DelayQueue源码分析
问题 (1)DelayQueue是阻塞队列吗? (2)DelayQueue的实现方式? (3)DelayQueue主要用于什么场景? 简介 DelayQueue是java并发包下的延时阻塞队列,常用于 ...
- 死磕 java集合之PriorityBlockingQueue源码分析
问题 (1)PriorityBlockingQueue的实现方式? (2)PriorityBlockingQueue是否需要扩容? (3)PriorityBlockingQueue是怎么控制并发安全的 ...
- 死磕 java集合之PriorityQueue源码分析
问题 (1)什么是优先级队列? (2)怎么实现一个优先级队列? (3)PriorityQueue是线程安全的吗? (4)PriorityQueue就有序的吗? 简介 优先级队列,是0个或多个元素的集合 ...
- 死磕 java集合之CopyOnWriteArraySet源码分析——内含巧妙设计
问题 (1)CopyOnWriteArraySet是用Map实现的吗? (2)CopyOnWriteArraySet是有序的吗? (3)CopyOnWriteArraySet是并发安全的吗? (4)C ...
- 死磕 java集合之ConcurrentHashMap源码分析(三)
本章接着上两章,链接直达: 死磕 java集合之ConcurrentHashMap源码分析(一) 死磕 java集合之ConcurrentHashMap源码分析(二) 删除元素 删除元素跟添加元素一样 ...
- 死磕 java集合之ArrayDeque源码分析
问题 (1)什么是双端队列? (2)ArrayDeque是怎么实现双端队列的? (3)ArrayDeque是线程安全的吗? (4)ArrayDeque是有界的吗? 简介 双端队列是一种特殊的队列,它的 ...
- 死磕 java集合之LinkedList源码分析
问题 (1)LinkedList只是一个List吗? (2)LinkedList还有其它什么特性吗? (3)LinkedList为啥经常拿出来跟ArrayList比较? (4)我为什么把LinkedL ...
随机推荐
- windows server防火墙添加例外的步骤
Windows Server 2012 防火墙如何添加端口例外的方法 在Windows Server 2012系统中,如果用户想在防火墙中开通一个端口,您可以按以下步骤执行: 1. 首先点击桌面左 ...
- Awake()跟Start()差在哪?
刚开始学Unity的时候,最难搞定的就是这两个functions的差异,依照官方文件所描述的: Awake(): Awake is called when the script instance is ...
- layui 富文本 图片上传 后端PHP接口
<!DOCTYPE html> <html> <head> <link rel="stylesheet" type="text/ ...
- 简单的异步函数async/await例子
function resolveAfter2Seconds(x){ return new Promise(resolve => { setTimeout(() => { resolve(x ...
- python 输出“Hello, world”
目的:制作第一个项目,输出“Hello, world” 首先查看自己电脑上的python版本号,方法打开cmd输入python 如果提示:不是内部或外部命令,也不是可运行的程序或批处理文件.那么需要设 ...
- S0到S5状态讲解
ACPI(高级配置和电源管理接口)的六种工作状态Advanced Configuration and Power Management InterfaceACPI表示高级配置和电源管理接口( Adva ...
- Beego学习笔记
Beego学习笔记 Go 路由(Controller) 路由就是根据用户的请求找到需要执行的函数或者controller. Get /v1/shop/nike ShopController Get D ...
- php实现猴子选大王
function getKing($n,$m) { $arr = range(1,$n); $i = 0; while(count($arr) > 1) { if(($i+1) % $m == ...
- jquery easyui datagrid mvc server端分页排序筛选的实现
1自定义一个ModelBinder public class filterRule { public string field { get; set; } public string op { get ...
- 搭建前端监控系统(三)NodeJs服务器部署篇
===================================================================== 监控系统预览地址: DEMO地址 GIT代码仓库地址 ...