1、概述

LinkedHashMap继承自HashMap,它能保证遍历元素时,输出的顺序和输入时的顺序相同。

LinkedHashMap不仅实现HashMap的开散列哈希表(数组+链表),还维护着一个运行于所有键值对的双向链接列表。此列表定义了迭代的顺序,该迭代顺序包括插入顺序和访问顺序两种,默认是插入顺序;可以通过设置accessOrder为true,把迭代顺序设置为访问顺序。

2、简要描述LinkedHashMap实现

LinkedHashMap与HashMap相似,它通过重写父类的方法,来实现双向链接表特性。

[java] view plaincopy
  1. public class LinkedHashMap<K, V> extends HashMap<K, V> implements Map<K, V>

LinkedHashMap采用的Hash算法和HashMap相同,不同的是它重新定义了数组保存的元素Entry。该Entry除了保存当前的对象的引用之外,还保存了它的上一个元素before和下一个元素after的引用,从而在哈希表的基础上构建一个双向链表。

[java] view plaincopy
  1. //双向链表的表头元素
  2. private transient Entry<K,V> header;
  3. /**
  4. * LinkedHashMap的Entry元素。
  5. * 继承HashMap的Entry元素,又保存了其上一个元素before和下一个元素after的引用。
  6. */
  7. private static class Entry<K,V> extends HashMap.Entry<K,V> {
  8. Entry<K,V> before, after;
  9. ……
  10. }

LinkedHashMap重写了父类构造函数中调用到的init方法,从而在调用父类构造方法之后,进一步完成对其元素Entry的初始化,init()方法如下:

[java] view plaincopy
  1. void init() {
  2. header = new Entry<K,V>(-1, null, null, null);
  3. header.before = header.after = header;
  4. }

3、迭代顺序

[java] view plaincopy
  1. //true表示按照访问顺序迭代,false时表示按照插入顺序
  2. private final boolean accessOrder;

LinkedHashMap重写了父类的HashMap的get方法:在调用父类的getEntry()方法取得查找的元素之后,再判断排序模式accessOrder是否为true,如果是,那么就把最新访问的元素添加到双向链表的表头,并从原来的位置删除(可以用来实现LRU访问)。因为链表的插入和删除操作都是常量级的时间复杂度,所以不会带来性能损失。

4、总结

LinkedHashMap在保留HashMap的查找效率的同时,保持元素输出的顺序和输入时的顺序相同,并提供了元素的LRU访问。

LinkedHashMap内部实现相关推荐

  1. java集合类学习笔记之LinkedHashMap

    1.简述 LinkedHashMap是HashMap的子类,他们最大的不同是,HashMap内部维护的是一个单向的链表数组,而LinkedHashMap内部维护的是一个双向的链表数组.HashMap是 ...

  2. 集合框架源码分析五之LinkedHashMap,LinkedHashSet

    LinkedHashMap是为了解决遍历Hash表的无序问题,它内部维护了一个链表用于记录你插入元素(或你访问元素的顺序)的位置,遍历时直接遍历链表,元素的顺序即为你插入的顺序,但是Entry对象要多 ...

  3. 面试必备:LinkedHashMap源码解析(JDK8)

    1 概述 在上文中,我们已经聊过了HashMap,本篇是基于上文的基础之上.所以如果没看过上文,请先阅读面试必备:HashMap源码解析(JDK8)  本文将从几个常用方法下手,来阅读LinkedHa ...

  4. java treemap 内存_Java中Map、HashMap、LinkedHashMap、TreeMap的区别

    Map: Map是一个接口不能实例化,Map接口主要有两个实现类:HashMap和TreeMap类.其中,HashMap类按哈希算法来存取对象,而TreeMap类可以对键对象进行排序: Map提供了一 ...

  5. Java类集框架 —— LinkedHashMap源码分析

    前言 我们知道HashMap底层是采用数组+单向线性链表/红黑树来实现的,HashMap在扩容或者链表与红黑树转换过程时可能会改变元素的位置和顺序.如果需要保存元素存入或访问的先后顺序,那就需要采用L ...

  6. TreeMap和LinkedHashMap

    TreeMap 总体特点:(主要是跟linkedHashMap比较) 底层是基于红黑树实现,是个有序集合,按照key的compareTo方法或在构造时传入的Comparator比较器进行排序.这里需要 ...

  7. 散列表、LinkedHashMap源码分析

    一.散列表 1.散列思想 散列表用的是数组支持按照下标随机访问数据的时候,时间复杂度是O(1)O(1)O(1)的特性.通过散列函数把元素的键值映射为下标,然后把数据存储在数组中对应下标的位置.当按照键 ...

  8. Java Collection系列之HashMap、ConcurrentHashMap、LinkedHashMap的使用及源码分析

    文章目录 HashMap HashMap的存储结构 初始化 put & get put元素 get元素 扩容 遍历Map jdk1.8中的优化 ConcurrentHashMap jdk1.7 ...

  9. JDK1.8源码分析:LinkedHashMap与LRU缓存设计思路

    概述 LinkedHashMap继承于HashMap,在HashMap的基础上,新增了两个特性: 支持以节点的插入顺序来迭代该map内的所有节点: 支持缓存设计中LRU的特性,即LinkedHashM ...

  10. Java程序员从笨鸟到菜鸟之(五)java开发常用类(包装,数字处理集合等)(下)...

     本文来自:曹胜欢博客专栏.转载请注明出处:http://blog.csdn.net/csh624366188 写在前面:由于前天项目老师建设局的项目快到验收阶段,所以,前天晚上通宵,昨天睡了大半天, ...

最新文章

  1. maven <skip></skip>属性
  2. SQL查询语句精华文章(转)
  3. 如何正确的终止正在运行的子线程
  4. jtessboxeditorfx 界面显示不出来_macOS 使用 XQuartz 支持 X11 实现 Linux 图形化界面显示...
  5. springboot完成进度条_Springboot从0开始第一周
  6. mybatis generator 中文注释_Mybatis提供的逆向工程
  7. 【面试】不容错过的12个深度学习面试问题
  8. 什么是面向对象编程的人生感悟
  9. MAC安装Mysql超详细完整教程
  10. linux内核异常解析,内核异常分析方法
  11. html5游戏开发教程实战:五子棋、四子棋、围棋、翻转棋四种对弈游戏,仅仅100行代码 ...
  12. java版 高斯过程,三维高斯过程回归
  13. 叶檀对巴菲特索罗斯寻找新淘金地的判读
  14. downloadmedia php,PHP 利用MediaWiki 实现中文简繁互转代码 完美支持大陆、香港、台湾及新加坡...
  15. 2018最受欢迎数据采集20大产品产品名单出炉!
  16. BUPT Summer Journey #test11 A
  17. 麦兜搞it python_一位大牛整理的python资源(转)
  18. 过年“飞”回家?携带移动电源登机需注意!
  19. SAP MTS案例教程简介
  20. 10个国家队出品的冷门APP,这才称得上是宝藏产品!

热门文章

  1. Win10编译SqlCipher步骤
  2. 上手DocumentDB On Azure (二)
  3. FileOprSer.class.php(文件上传与下载类)
  4. iOS原生的AVFoundation扫描二维码/条形码
  5. 地址修改验证TAR Oracle部署
  6. UCenter密码算法规则和生成方法
  7. ZooKeeper的安装、配置、启动和使用(一)——单机模式
  8. 如何解决Please ensure that adb is correctly located at......
  9. ECMAScript 6细说转码的常见的几种方案
  10. JavaScript比较是否在某时间段内