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 ...
随机推荐
- java,arduino,C#之间的一些编码转换
1.C#-> Encoding.UTF8.GetBytes( "abc中") ->[97,98,99,228,184,173] java->byte[] bs= ...
- python类的继承-1
#!/usr/bin/python3 #类定义 class people: #定义基本属性 name = '' age = 0 #定义私有属性,私有属性在类外部无法直接进行访问 __weight = ...
- Java static说明
class Person{ String name;//成员变量,实例变量 static String country = "CN";//静态变量.类变量 public void ...
- struts2-core-2.3.20.jar
核心配置位于该jar struts-default.xml struts-2.3.dtd <?xml version="1.0" encoding="UTF-8&q ...
- 解决火狐浏览器发送jquery的ajax请求无效的问题
今天遇到这样一个问题: 页面在chrome下发送ajax的请求是没有问题的,但是在firfox下无效. 代码大致如下: //前面省略 <form> ..... <button cla ...
- java中如何通过Class获取类的属性、方法、注释
public static String getPKName(Class clazz) { Field[] fields = clazz.getDeclaredFields(); for (Field ...
- 万能的ctrl+shift+F(Element 'beans' cannot have character [children], because the type's content type is element-only.错误)
今天在spring-servlet.xml文件中出现了一个莫名其妙的错误:Element 'beans' cannot have character [children], because the t ...
- Android-Xml文件生成,Xml数据格式写入
在上一篇博客,Android-XML格式描述,介绍来XML在Android中的格式: 生成xml文件格式数据,Android提供了Xml.newSerializer();,可以理解为Xml序列化: 序 ...
- Code Review Checklist and Guidelines for C# Developers
Checklist1. Make sure that there shouldn't be any project warnings.2. It will be much better if Code ...
- Ubuntu-18.04.2系统 Nginx+uWSGI+Django 部署生产环境
首先准备环境: 1.使用虚拟机 VMware Workstation Pro (也可以不用),安装Ubuntu-18.04.2系统 开始搭建环境 (因为ubuntu18.4.2集成了python3.6 ...