码迷,mamicode.com
首页 > 编程语言 > 详细

Java集合四大家族的故事(四)——Map家族的LinkedHashMap

时间:2015-08-16 23:33:42      阅读:387      评论:0      收藏:0      [点我收藏+]

标签:

每个家族都有一个最基本且最常用的数据类型:比如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<String,Integer> lhm=new LinkedHashMap<String,Integer>();
		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<String,Integer> lhm2=new LinkedHashMap<String,Integer>();
		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<String,Integer> hm=new HashMap<String,Integer>();
		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<String,Integer> hm2=new HashMap<String,Integer>();
		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拼接起来以在链表中删除掉自己。

		
	}


Java集合四大家族的故事(四)——Map家族的LinkedHashMap

标签:

原文地址:http://my.oschina.net/happyBKs/blog/493260

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!