博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java集合四大家族的故事(四)——Map家族的LinkedHashMap
阅读量:6451 次
发布时间:2019-06-23

本文共 2249 字,大约阅读时间需要 7 分钟。

hot3.png

每个家族都有一个最基本且最常用的数据类型:比如List系列的ArrayList,Map系列的HashMap,并且,它们的本质都是数组存储结构。相似的是,每个家族都有一个Linked开头的类,如List家族的LinkedList和Map家族的LinkedHashMap,这两个类的存储的数据结构又都是双向链表(其实是连续数组添加了两个方向的指针,所以既能与数组兼容,又能够有双向链表的性质)。而引入双向链表功能的目的就是为了能够有序遍历。

今天,我们就来介绍LinkedHashMap。

扩展HashMap增加双向链表的实现,号称是最占内存的数据结构。支持iterator()时按Entry的插入顺序来排序(但是更新不算, 如果设置accessOrder属性为true,则所有读写访问都算)。

实现上是在Entry上再增加属性before/after指针,插入时把自己加到Header Entry的前面去。如果所有读写访问都要排序,还要把前后Entry的before/after拼接起来以在链表中删除掉自己。

(本文出自:http://my.oschina.net/happyBKs/blog/493260)

下面的例子,我没对LinkedHashMap和HashMap分别做了两组比较,数据两组分别一一对应。

我们可以发现,LinkedHashMap返回的key-value的顺序,与我们插入put的顺序一致,插入的顺序不同,返回的顺序也不同。而HashMap无论我们按照什么顺序插入,返回的顺序都是唯一的,且与插入顺序无关,HashMap的返回key-value的顺序只与hashCode有关。

@Test	public void testLinkedHashMap(){		System.out.println("LinkedHashMap: N-M-S");		LinkedHashMap
 lhm=new LinkedHashMap
(); lhm.put("NOKIA", 4000); lhm.put("MOTO", 3000); lhm.put("SAMGSUNG", 3500); for(Entry e:lhm.entrySet()){ System.out.println(e.getKey()+": "+e.getValue()); } System.out.println("LinkedHashMap: S-N-M"); LinkedHashMap
 lhm2=new LinkedHashMap
(); lhm2.put("SAMGSUNG", 3500); lhm2.put("NOKIA", 4000); lhm2.put("MOTO", 3000); for(Entry e:lhm2.entrySet()){ System.out.println(e.getKey()+": "+e.getValue()); } System.out.println("HashMap: N-M-S"); HashMap
 hm=new HashMap
(); hm.put("NOKIA", 4000); hm.put("MOTO", 3000); hm.put("SAMGSUNG", 3500); for(Entry e:hm.entrySet()){ System.out.println(e.getKey()+": "+e.getValue()); } System.out.println("HashMap: S-N-M"); HashMap
 hm2=new HashMap
(); hm2.put("SAMGSUNG", 3500); hm2.put("NOKIA", 4000); hm2.put("MOTO", 3000); for(Entry e:hm2.entrySet()){ System.out.println(e.getKey()+": "+e.getValue()); } /* LinkedHashMap: N-M-S NOKIA: 4000 MOTO: 3000 SAMGSUNG: 3500 LinkedHashMap: S-N-M SAMGSUNG: 3500 NOKIA: 4000 MOTO: 3000 HashMap: N-M-S MOTO: 3000 NOKIA: 4000 SAMGSUNG: 3500 HashMap: S-N-M MOTO: 3000 NOKIA: 4000 SAMGSUNG: 3500*/ //HashMap插入的键值对是无序的,位置只与key关联;LinkedHashMap与插入顺序相关 //实际上LinkedHashMap是在Entry上再增加属性before/after指针, //插入时把自己加到Header Entry的前面去。 //如果所有读写访问都要排序,还要把前后Entry的before/after拼接起来以在链表中删除掉自己。 }

转载于:https://my.oschina.net/happyBKs/blog/493260

你可能感兴趣的文章
Shell编程-环境变量配置文件
查看>>
thymeleaf 中文乱码问题
查看>>
(转)CSS浮动(float,clear)通俗讲解
查看>>
os.walk函数
查看>>
[Unity3d]DrawCall优化手记
查看>>
细数.NET 中那些ORM框架 —— 谈谈这些天的收获之一
查看>>
SQL Serever学习7——数据表2
查看>>
洛谷——P2404 自然数的拆分问题
查看>>
(转)Mac 下设置android NDK的环境
查看>>
[struts]s:action 的使用方法
查看>>
dubbo问题总结
查看>>
20165320 第三周学习总结
查看>>
Struts2和Spring MVC的区别
查看>>
angular-bootstrap ui-date组件问题总结
查看>>
理解Javascript参数中的arguments对象
查看>>
p2:千行代码入门python
查看>>
bzoj1106[POI2007]立方体大作战tet*
查看>>
spring boot configuration annotation processor not found in classpath问题解决
查看>>
【转】正则基础之——神奇的转义
查看>>
团队项目测试报告与用户反馈
查看>>