转载请注明源出处: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的更多相关文章

  1. Java基础知识强化之集合框架笔记58:Map集合之LinkedHashMap类的概述

    1. LinkedHashMap类的概述 LinkedHashMap:Map接口的哈希表(保证唯一性) 和 链接(保证有序性)列表实现,具有可预知的迭代顺序. 2. 代码示例: package cn. ...

  2. Java从入门到放弃18---Map集合/HashMap/LinkedHashMap/TreeMap/集合嵌套/Collections工具类常用方法

    Java从入门到放弃18—Map集合/HashMap/LinkedHashMap/TreeMap/集合嵌套/Collections工具类常用方法01 Map集合Map集合处理键值映射关系的数据为了方便 ...

  3. java的集合框架最全详解

    java的集合框架最全详解(图) 前言:数据结构对程序设计有着深远的影响,在面向过程的C语言中,数据库结构用struct来描述,而在面向对象的编程中,数据结构是用类来描述的,并且包含有对该数据结构操作 ...

  4. 谈谈Java的集合组件

    让我们一起谈谈Java的集合组件 我们在使用Java的时候,都会遇到并使用到Java的集合.在这里通过自己的理解和网上的资源对Java的集合方面的使用做一个简单的讲解和总结. Java主要分为3个集合 ...

  5. Java基础——集合框架

    Java的集合框架是Java中很重要的一环,Java平台提供了一个全新的集合框架.“集合框架”主要由一组用来操作对象的接口组成.不同接口描述一组不同数据类型.Java平台的完整集合框架如下图所示: 上 ...

  6. Java API —— HashMap类 & LinkedHashMap类

    1.HashMap类 1)HashMap类概述         键是哈希表结构,可以保证键的唯一性 2)HashMap案例         HashMap<String,String>   ...

  7. 浅谈Java的集合框架

    浅谈Java的集合框架 一.    初识集合 重所周知,Java有四大集合框架群,Set.List.Queue和Map.四种集合的关注点不同,Set 关注事物的唯一性,List 关注事物的索引列表,Q ...

  8. Java之集合初探(一)

    一.集合概述.区别 集合是一种容器,数组也是一种容器 在Java编程中,装各种各样的对象(引用类型)的叫做容器. 为什么出现集合类? 面向对象语言对事物的体现都是以对象的形式,所以为了方便对多个对象的 ...

  9. java中集合Collection转list对象

    参考:java中集合Collection转list对象 首先我的需求是获取到购物车列表,购物车列表是一个Map对象,构造方法获取购物项,这里购物项是Collection对象 // 购物项集合,K商品I ...

随机推荐

  1. arduino 与 android 通过TCP进行字节收发

    arduino #include <avr/wdt.h> #include <SoftwareSerial.h> #define FPIN 13 SoftwareSerial ...

  2. python5-常用模块

    collection 模块 # pypi 可以查询python的模块在内置数据类型(dict.list.set.tuple)的基础上,collections模块还提供了几个额外的数据类型:Counte ...

  3. PrefixHeader.pch 在工程中的使用

    1)  新建一个pch文件 2) 在 工程 Build Settings 中搜索 header  将Precompile Prefix Header 置为YES 2) 选中pch文件, 将右侧相对路径 ...

  4. C++ 11可变参数接口设计在模板编程中应用的一点点总结

    概述 本人对模板编程的应用并非很深,若要用一句话总结我个人对模板编程的理解,我想说的是:模板编程是对类定义的弱化. 如何理解“类定义的弱化”? 一个完整的类有如下几部分组成: 类的名称: 类的成员变量 ...

  5. python的特性

    python使用c语言开发 1.面向对象的特性 面向对象的程序设计抽象出对象的行为和属性,把行为和属性分离开,但是又合理的组织在一起.它消除了保护类型.抽象类.接口等面向对象的元素,使得面向对象的概念 ...

  6. Android-DateUtil工具类

    时间相关工具类 public class DateUtil { private DateUtil(){} /** * 枚举日期格式 */ public enum DatePattern{ /** * ...

  7. 【Win10】实现 ListViewBase 平滑滚动

    首先解释下标题的 ListViewBase 是什么鬼.ListViewBase 我们可以查阅 MSDN 文档:https://msdn.microsoft.com/zh-cn/library/wind ...

  8. 学习总结---INNODB 事务并发

    目前在做一个OLTP的数据库系统,批量读写和随机读写并发,情况比较复杂.INNODB是我们的MYSQL引擎,他的主要特点是读操作可以不受阻塞,而修改操作会加锁.如何才能最高效的使用innodb是我们需 ...

  9. ASP.NET MVC中设置跨域

    ASP.NET MVC中设置跨域 1.什么是跨域请求 js禁止向不是当前域名的网站发起一次ajax请求,即使成功respone了数据,但是你的js仍然会报错.这是JS的同源策略限制,JS控制的并不是我 ...

  10. dataframe.isnull()函数, DatetimeIndex,黄包车代码155行

    待解决 feature 4 完全没懂 feature 5 219行: if (row.userid == action['userid'][row.max_index - 1]):   ????