Java之集合(九)LinkedHashMap
转载请注明源出处:http://www.cnblogs.com/lighten/p/7367525.html
1.前言
前一章对Map中的HashMap进行了讲解(虽然只详细介绍了一下红黑树的部分),本章对其子类LinkedHashMap进行介绍。首先我们要明确为什么会有这样一个Map?原因很简单,在HashMap的存储步骤讲解中,可以很容易看出其并不能保证插入map的先后顺序。LinkedHashMap就是来解决这个问题的,其实现方法就是内含一个双向链表,包含所有的Entry键值对,这样迭代的时候就能保证其顺序是插入顺序了。值得一提的是,这个插入顺序并不受到一个键重复插入Map的影响,后面会解释为什么。
2.LinkedHashMap

上图就是内含的双向链表了,头尾节点的定义。accessOrder决定了是否将重复插入的键值对返到链表末尾,遍历的时候就产生了是插入顺序,还是access顺序了。true是按照插入顺序,不放在结尾;false是access顺序,放在结尾。

链表中的一个常见的方法,将结点插入链表尾。

将其中一个结点用新的结点替换。

上面这些方法替换了HashMap其自身的方法,使得HashMap的基本操作put,get,remove等使用LinkedHashMap的方法处理,TreeNode方法也进行了兼容。方法比较简单,就不再进行介绍了。

迭代器的实现方法,也很简单,不再描述,可以看出就是链表的顺序了。
最后再关注一下accessOrder是如何导致重复键不影响插入顺序的。这还要回到HashMap的put方法。

putValue方法中有这么一段,如果Map中存在这个键值对,就替换了原键。关键方法是afterNodeAccess,这个方法由LinkedHashMap重写了。

这个方法就能看出accessOrder决定了是否将重复插入的键放在链表最后,所以当accessOrder为false的时候,不会将重复键放在末尾,是insert顺序。否则移到末尾,是access顺序。顺便提下,默认的LinkedHashMap都是false,是insert顺序。
最后,还是强调一下LinkedHashMap的实现还是通过HashMap的,其基本方法并没有改变,只是重写了部分方法,将迭代器等重写。区别仅仅在于遍历是有顺序,存储还是通过HashMap的相关方法完成的。
Java之集合(九)LinkedHashMap的更多相关文章
- Java基础知识强化之集合框架笔记58:Map集合之LinkedHashMap类的概述
1. LinkedHashMap类的概述 LinkedHashMap:Map接口的哈希表(保证唯一性) 和 链接(保证有序性)列表实现,具有可预知的迭代顺序. 2. 代码示例: package cn. ...
- Java从入门到放弃18---Map集合/HashMap/LinkedHashMap/TreeMap/集合嵌套/Collections工具类常用方法
Java从入门到放弃18—Map集合/HashMap/LinkedHashMap/TreeMap/集合嵌套/Collections工具类常用方法01 Map集合Map集合处理键值映射关系的数据为了方便 ...
- java的集合框架最全详解
java的集合框架最全详解(图) 前言:数据结构对程序设计有着深远的影响,在面向过程的C语言中,数据库结构用struct来描述,而在面向对象的编程中,数据结构是用类来描述的,并且包含有对该数据结构操作 ...
- 谈谈Java的集合组件
让我们一起谈谈Java的集合组件 我们在使用Java的时候,都会遇到并使用到Java的集合.在这里通过自己的理解和网上的资源对Java的集合方面的使用做一个简单的讲解和总结. Java主要分为3个集合 ...
- Java基础——集合框架
Java的集合框架是Java中很重要的一环,Java平台提供了一个全新的集合框架.“集合框架”主要由一组用来操作对象的接口组成.不同接口描述一组不同数据类型.Java平台的完整集合框架如下图所示: 上 ...
- Java API —— HashMap类 & LinkedHashMap类
1.HashMap类 1)HashMap类概述 键是哈希表结构,可以保证键的唯一性 2)HashMap案例 HashMap<String,String> ...
- 浅谈Java的集合框架
浅谈Java的集合框架 一. 初识集合 重所周知,Java有四大集合框架群,Set.List.Queue和Map.四种集合的关注点不同,Set 关注事物的唯一性,List 关注事物的索引列表,Q ...
- Java之集合初探(一)
一.集合概述.区别 集合是一种容器,数组也是一种容器 在Java编程中,装各种各样的对象(引用类型)的叫做容器. 为什么出现集合类? 面向对象语言对事物的体现都是以对象的形式,所以为了方便对多个对象的 ...
- java中集合Collection转list对象
参考:java中集合Collection转list对象 首先我的需求是获取到购物车列表,购物车列表是一个Map对象,构造方法获取购物项,这里购物项是Collection对象 // 购物项集合,K商品I ...
随机推荐
- 安装memcache服务
d:\tools\memcache\setup\memcached -d install
- Myeclipse2014的Preview乱码问题
1.问题图样 2.问题探究:之前的版本没有这个问题,正常服务器部署也没有问题,而且改正了工程的编码设置 JSP的编码方式 3.问题解决:问题还是没有解决,最后找到了方法,似乎是跟本地编码反冲 选中pr ...
- HDU 1197 Specialized Four-Digit Numbers (枚举+进制转化,简单)
题意:让求从2992-9999中所有数字,满足10进制各位之和和12进制和16进制各位数字之和相等. 析:没啥可说的,只能枚举从2992-9999,每个进制都算一下. 代码如下: #include & ...
- python 按行读取判断是否为空
for line in fr.readlines(): try: # print(len(line)) if(len(line)==1): continue else: fw.write(matche ...
- 抓包工具 - HttpWatch(功能详细介绍)
HttpWatch是功能强大的网页数据分析工具,集成在IE工具栏,主要功能有网页摘要.cookies管理.缓存管理.消息头发送/接收,字符查询.POST数据.目录管理功能和报告输出.HttpWatch ...
- Using Integrated SOA Gateway in Oracle EBS(websevice)
http://blog.csdn.net/pan_tian/article/details/10159935 Oracle EBS如何与第三方系统相集成?比如这样的需求,X系统知道物料编码,需要从EB ...
- Linux SSH无密码登录
Linux服务器常见的登录方式有两种:密码登录.秘钥登录.工作中我们最常使用的是用秘钥登录的方法,因为使用秘钥登录更高效.更安全. 如何实现SSH无密码登录: 原理:无密码ssh登录的主要操作为将本机 ...
- 在Windows Server 2012 R2域环境中禁用(取消)密码复杂策略
windows server 2012域环境默认启用密码复杂策略,例如: 至少有六个字符长,包含以下四类字符中的三类字符:英文大写字母(A 到 Z),英文小写字母(a 到 z),10 个基本数字(0 ...
- 截图-----Selenium快速入门(十二)
在自动化测试过程中,截图是常见的操作,因为有时候单靠程序无法判断是否已得到期望的结果,所以需要截图判断.又或者截图是作为判断的存证.Selenium的截图操作也是非常简单,而且自带了一个文件操作类Fi ...
- Java基础学习篇---------多线程
一.编写两种多线程的方法 (1).Thread(它是继承Runnable的子类) class MyThread extends Thread{ private int ticket = 5; @Ove ...