1 前言LinkedHashMap继承于HashMap,如果对HashMap原理还不清楚的同学,请先看下面https://www.jianshu.com/p/dde9b12343c1
2 LinkedHashMap使用与实现先来一张LinkedHashMap的结构图,不要虚,看完文章再来看这个图,就秒懂了,先混个面熟:

文章插图
LinkedHashMap结构.png
2.1 应用场景
HashMap是无序的,当我们希望有顺序地去存储key-value时,就需要使用LinkedHashMap了 。
Map<String, String> hashMap = new HashMap<String, String>(); hashMap.put("name1", "josan1"); hashMap.put("name2", "josan2"); hashMap.put("name3", "josan3"); Set<Entry<String, String>> set = hashMap.entrySet(); Iterator<Entry<String, String>> iterator = set.iterator(); while(iterator.hasNext()) { Entry entry = iterator.next(); String key = (String) entry.getKey(); String value = https://www.isolves.com/it/cxkf/bk/2019-08-30/(String) entry.getValue(); System.out.println("key:" + key + ",value:" + value); }

文章插图
image.png
我们是按照xxx1、xxx2、xxx3的顺序插入的,但是输出结果并不是按照顺序的 。
同样的数据,我们再试试LinkedHashMap
Map<String, String> linkedHashMap = new LinkedHashMap<>(); linkedHashMap.put("name1", "josan1"); linkedHashMap.put("name2", "josan2"); linkedHashMap.put("name3", "josan3"); Set<Entry<String, String>> set = linkedHashMap.entrySet(); Iterator<Entry<String, String>> iterator = set.iterator(); while(iterator.hasNext()) { Entry entry = iterator.next(); String key = (String) entry.getKey(); String value = https://www.isolves.com/it/cxkf/bk/2019-08-30/(String) entry.getValue(); System.out.println("key:" + key + ",value:" + value); }

文章插图
image.png
结果可知,LinkedHashMap是有序的,且默认为插入顺序 。
2.2 简单使用
跟HashMap一样,它也是提供了key-value的存储方式,并提供了put和get方法来进行数据存取 。
LinkedHashMap<String, String> linkedHashMap = new LinkedHashMap<>(); linkedHashMap.put("name", "josan"); String name = linkedHashMap.get("name");2.3 定义
LinkedHashMap继承了HashMap,所以它们有很多相似的地方 。
public class LinkedHashMap<K,V> extends HashMap<K,V> implements Map<K,V>{2.4 构造方法

文章插图
image.png
LinkedHashMap提供了多个构造方法,我们先看空参的构造方法 。
public LinkedHashMap() { // 调用HashMap的构造方法,其实就是初始化Entry[] table super(); // 这里是指是否基于访问排序,默认为false accessOrder = false; }首先使用super调用了父类HashMap的构造方法,其实就是根据初始容量、负载因子去初始化Entry[] table,详细的看上一篇HashMap解析 。
然后把accessOrder设置为false,这就跟存储的顺序有关了,LinkedHashMap存储数据是有序的,而且分为两种:插入顺序和访问顺序 。
这里accessOrder设置为false,表示不是访问顺序而是插入顺序存储的,这也是默认值,表示LinkedHashMap中存储的顺序是按照调用put方法插入的顺序进行排序的 。LinkedHashMap也提供了可以设置accessOrder的构造方法,我们来看看这种模式下,它的顺序有什么特点?
// 第三个参数用于指定accessOrder值 Map<String, String> linkedHashMap = new LinkedHashMap<>(16, 0.75f, true); linkedHashMap.put("name1", "josan1"); linkedHashMap.put("name2", "josan2"); linkedHashMap.put("name3", "josan3"); System.out.println("开始时顺序:"); Set<Entry<String, String>> set = linkedHashMap.entrySet(); Iterator<Entry<String, String>> iterator = set.iterator(); while(iterator.hasNext()) { Entry entry = iterator.next(); String key = (String) entry.getKey(); String value = (String) entry.getValue(); System.out.println("key:" + key + ",value:" + value); } System.out.println("通过get方法,导致key为name1对应的Entry到表尾"); linkedHashMap.get("name1"); Set<Entry<String, String>> set2 = linkedHashMap.entrySet(); Iterator<Entry<String, String>> iterator2 = set2.iterator(); while(iterator2.hasNext()) { Entry entry = iterator2.next(); String key = (String) entry.getKey(); String value = https://www.isolves.com/it/cxkf/bk/2019-08-30/(String) entry.getValue(); System.out.println("key:" + key + ",value:" + value); }
推荐阅读
- 电热水龙头原理是什么
- MySql 三大知识点,索引、锁、事务,原理分析
- MySQL索引原理
- Google SEO 系列 - 搜索引擎原理
- 谷歌工具——关键字规划师的操作指南和工作原理
- js中几种实用的跨域方法原理详解
- 自动感应水龙头怎么样 自动感应水龙头工作原理
- FastThreadLocal 原理分析
- 魔方颜色对应图 魔方公式符号意思图解
- 扇贝怎么清洗内脏图解 扇贝怎么清洗内脏
