深度剖析Java集合之LinkedHashMap
2021/10/9 14:18:39
本文主要是介绍深度剖析Java集合之LinkedHashMap,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
初识LinkedHashMap
我们想在页面展示一周内的消费变化情况,用echarts面积图进行展示。如下:
我们在后台将数据构造完成
HashMap<String, Integer> map = new HashMap<>(); map.put("星期一", 40); map.put("星期二", 43); map.put("星期三", 35); map.put("星期四", 55); map.put("星期五", 45); map.put("星期六", 35); map.put("星期日", 30); for (Map.Entry<String, Integer> entry : map.entrySet()){ System.out.println("key: " + entry.getKey() + ", value: " + entry.getValue()); } /** * 结果如下: * key: 星期二, value: 40 * key: 星期六, value: 35 * key: 星期三, value: 50 * key: 星期四, value: 55 * key: 星期五, value: 45 * key: 星期日, value: 65 * key: 星期一, value: 30 */
然而页面上一展示,发现并非如此,我们打印出来看,发现顺序并非我们所想,先put进去的先get出来
那么如何保证预期展示结果如我们所想呢,这个时候就需要用到LinkedHashMap实体,首先我们把上述代码用LinkedHashMap进行重构
LinkedHashMap<String, Integer> map = new LinkedHashMap<>(); map.put("星期一", 40); map.put("星期二", 43); map.put("星期三", 35); map.put("星期四", 55); map.put("星期五", 45); map.put("星期六", 35); map.put("星期日", 30); for (Map.Entry<String, Integer> entry : map.entrySet()){ System.out.println("key: " + entry.getKey() + ", value: " + entry.getValue()); }
这个时候,结果正如我们所预期
key: 星期一, value: 40 key: 星期二, value: 43 key: 星期三, value: 35 key: 星期四, value: 55 key: 星期五, value: 45 key: 星期六, value: 35 key: 星期日, value: 30
LinkedHashMap 实现原理
- LinkedHashMap 通过特有底层双向链表的支持,使得LinkedHashMap可以保存元素之间的顺序,例如插入顺序或者访问顺序,而HashMap因为没有双向链表的支持,所以就不能保持这种顺序,所以它的访问就是随机的了
- 和HashMap一样,还是通过数组存储元素的
- 这里的顺序指的是遍历的顺序,定义了头结点head,当我们调用迭代器进行遍历时,通过head开始遍历,通过after属性可以不断找到下一个,直到tail尾结点,从而实现顺序性。在同一个hash(其实更准确的说是同一个下标,数组index ,在上图中表现了同一列)链表内部next和HashMap.Node.next 的效果是一样的。不同点在于before和after可以连接不同hash之间的链表,也就是说双向链表是可以跨任何index 连接的,也就是说将LinkedHashMap里面的所有元素按照特定的顺序连接起来的
LinkedHashMap 的最终形态
本质上,LinkedHashMap = HashMap + 双向链表,也就是说,HashMap和双向链表合二为一即是LinkedHashMap。也可以这样理解,LinkedHashMap 在不对HashMap做任何改变的基础上,给HashMap的任意两个节点间加了两条连线(before指针和after指针),使这些节点形成一个双向链表。在LinkedHashMapMap中,所有put进来的Entry都保存在HashMap中,但由于它又额外定义了一个以head为头结点的空的双向链表,因此对于每次put进来Entry还会将其插入到双向链表的尾部。
其中,HashMap与LinkedHashMap的Entry结构示意图如下图所示
这篇关于深度剖析Java集合之LinkedHashMap的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2025-01-11有哪些好用的家政团队管理工具?
- 2025-01-11营销人必看的GTM五个指标
- 2025-01-11办公软件在直播电商前期筹划中的应用与推荐
- 2025-01-11提升组织效率:上级管理者如何优化跨部门任务分配
- 2025-01-11酒店精细化运营背后的协同工具支持
- 2025-01-11跨境电商选品全攻略:工具使用、市场数据与选品策略
- 2025-01-11数据驱动酒店管理:在线工具的核心价值解析
- 2025-01-11cursor试用出现:Too many free trial accounts used on this machine 的解决方法
- 2025-01-11百万架构师第十四课:源码分析:Spring 源码分析:深入分析IOC那些鲜为人知的细节|JavaGuide
- 2025-01-11不得不了解的高效AI办公工具API