转载请注明源出处: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. 用Java操作数据库Datetime数据

    Date.Calendar.Timestamp的区别.相互转换与使用 1 Java.util.Date 包含年.月.日.时.分.秒信息. // String转换为Date String dateStr ...

  2. DataGrid组件

    <?xml version="1.0" encoding="utf-8"?><s:WindowedApplication xmlns:fx=& ...

  3. 笔记本的Windows系统怎么设置有了外接鼠标后停用触摸板

    点击控制面板,切换小图标模式,找到鼠标,点击它,然后会弹出一个窗口,找到ELAN选项卡(一般有个红色图标,不过可能需要对应驱动才会有此选项卡),选中插入外置 USB 指向装置时禁用.点击确定保存配置即 ...

  4. struts 拦截器

    my-default.xml <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts ...

  5. 循环读取list 的几种方法?

    1.最常用的方法.循环找出该位子的list元素for(int i = 0;i < list.size(); i ++){System.out.println(list.get(i));}2.利用 ...

  6. Android中设置分割线

    设置分隔线的方法一: 在需要设置分隔线的布局文件中加入如下代码: <View     android:layout_width="fill_parent"      andr ...

  7. DBCC--OPENTRAN

    返回最早开始的但仍在运行的事务 数据库 'DB1' 的事务信息. 最早的活动事务: SPID (服务器进程 ID): 60 UID (用户 ID): -1 名称          : user_tra ...

  8. 对Cookie和Session的理解

    本篇文章系自己总结经验,如果有朋友感觉哪里有问题,欢迎留言评论,谢谢~! Cookie和Session的产生背景: 在动态页面里面,每个变量都是有有效期的,所有的变量的最大生命周期就是一个脚本的周期( ...

  9. 前端项目打包工具weexpack的安装

    最下面是本人安装时候的系统环境,本篇文章只限于参考,不一定非得是这样,原因你懂得. 打包的过程中出现的问题 1.执行到weexpack run android的时候,到了resolving class ...

  10. C# 读取Excel,一波华丽的操作

    C# 读取Excel,其实有很多方法.但是今天要来一波华丽的操作. 先看效果: 以上这波操作使用了 ExcelDataReader 和 ExcelDataReader.DataSet 完成的. Exc ...