文档章节

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

HappyBKs
 HappyBKs
发布于 2015/08/16 22:03
字数 673
阅读 336
收藏 10

每个家族都有一个最基本且最常用的数据类型:比如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拼接起来以在链表中删除掉自己。

		
	}


© 著作权归作者所有

HappyBKs

HappyBKs

粉丝 663
博文 306
码字总数 481268
作品 0
浦东
程序员
私信 提问
java集合之ConcurrentSkipListSet源码分析——Set大汇总

java集合之ConcurrentSkipListSet源码分析——Set大汇总 问题 (1)ConcurrentSkipListSet的底层是ConcurrentSkipListMap吗? (2)ConcurrentSkipListSet是线程安全的吗? (3)ConcurrentS...

优惠券活动
04/19
0
0
【Java入门提高篇】Day19 Java容器类详解(二)Map接口

上一篇里介绍了容器家族里的大族长——Collection接口,今天来看看容器家族里的二族长——Map接口。 Map也是容器家族的一个大分支,但里面的元素都是以键值对(key-value)的形式存放的,就像...

MFrank
2018/05/25
0
0
【Java入门提高篇】Java集合类详解(一)

今天来看看Java里的一个大家伙,那就是集合。 集合嘛,就跟它的名字那样,是一群人多势众的家伙,如果你学过高数,没错,就跟里面说的集合是一个概念,就是一堆对象的集合体。集合就是用来存...

MFrank
2018/05/18
0
0
Java互联网四大项目开发案例教学,阿里天猫核心技术首次公布!

Java互联网四大项目开发案例教学,阿里天猫核心技术首次公布! 阶段一 初级项目阶段 技术性点 项目范例 1)视频播放器 — 成功视频播放器4大基本功能和播放列表8大基本功能,熟练掌握集合和 ...

Java小仙女
02/18
0
0
Java Connection集合分析之Set

Java Connection集合家庭分析 Java集合大致可以分为Set、List、Queue和Map四种体系,其中Set代表无序、不可重复的集合;List代表有序、重复的集合;而Map则代表具有映射关系的集合,Java 5 ...

我爱春天的毛毛雨
2018/11/14
30
0

没有更多内容

加载失败,请刷新页面

加载更多

mysql概览

学习知识,首先要有一个总体的认识。以下为mysql概览 1-架构图 2-Detail csdn |简书 | 头条 | SegmentFault 思否 | 掘金 | 开源中国 |

程序员深夜写bug
今天
8
0
golang微服务框架go-micro 入门笔记2.2 micro工具之微应用利器micro web

micro web micro 功能非常强大,本文将详细阐述micro web 命令行的功能 阅读本文前你可能需要进行如下知识储备 golang分布式微服务框架go-micro 入门笔记1:搭建go-micro环境, golang微服务框架...

非正式解决方案
今天
6
0
前端——使用base64编码在页面嵌入图片

因为页面中插入一个图片都要写明图片的路径——相对路径或者绝对路径。而除了具体的网站图片的图片地址,如果是在自己电脑文件夹里的图片,当我们的HTML文件在别人电脑上打开的时候图片则由于...

被毒打的程序猿
今天
8
0
Flutter 系列之Dart语言概述

Dart语言与其他语言究竟有什么不同呢?在已有的编程语言经验的基础上,我们该如何快速上手呢?本篇文章从编程语言中最重要的组成部分,也就是基础语法与类型变量出发,一起来学习Dart吧 一、...

過愙
今天
5
0
rime设置为默认简体

转载 https://github.com/ModerRAS/ModerRAS.github.io/blob/master/_posts/2018-11-07-rime%E8%AE%BE%E7%BD%AE%E4%B8%BA%E9%BB%98%E8%AE%A4%E7%AE%80%E4%BD%93.md 写在开始 我的Arch Linux上......

zhenruyan
今天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部