【JDK源码阅读9-util】Map接口之LinkedHashMap

本文详细探讨了LinkedHashMap的类继承关系、实现特点、内部结构及源码分析,包括与HashMap的区别、构造器、Entry内部实现以及迭代器的工作原理。
摘要由CSDN通过智能技术生成

LinkedHashMap

一、类继承关系

public class LinkedHashMap<K,V>
                  extends HashMap<K,V>
                  implements Map<K,V>

二、LinkedHashMap实现类特点

  
与HashMap的异同:同样是基于散列表实现,   
       区别是LinkedHashMap内部多了一个双向循环链表的维护,该链表是有序,可以按元素插入顺序或元素最近访问顺序(LRU)排列
      简单地说:LinkedHashMap=散列表+循环双向链表能够保持遍历的顺序和插入的顺序一致。
总结:
1.LinkedHashMap继承自HashMap,具有HashMap的大部分特性, 比如支持null键和值,默认容量为16,装载因子为0.75,  
         非线程安全等等;
改为同步:
* Map m = Collections.synchronizedMap(new LinkedHashMap());

2.LinkedHashMap通过设置accessOrder控制遍历顺序是按照插入顺序还是按照访问顺序。
 
          当accessOrder为true时,可以利用其完成LRU缓存的功能;
3.LinkedHashMap内部维护了一个双向循环链表,并且其迭代操作时通过链表完成的,而不是去遍历hash表。
4 增加了维护链接列表的开支,性能比HashMap稍逊;

三、内部结构

第一张图是LinkedHashMap的全部数据结构,包含散列表和循环双向链表;
左边的红色箭头引用为Entry节点对象的next引用(散列表中的单链表),
绿色线条为Entry节点对象的before, after引用(循环双向链表的前后引用);
由图可知:LinkedHashMa在遍历的时候直接遍历双向循环链;

          第二张图专门把循环双向链表抽取出来,直观一点,注意该循环双向链表的头部存放的是最久访问的节点或最先插入的节点,尾部为最近访问的或最近插入的节点,迭代器遍历方向是从链表的头部开始到链表尾部结束,在链表尾部有一个空的header节点,该节点不存放key-value内容,为LinkedHashMap类的成员属性,循环双向链表的入口;

四、源码分析

与HashMap不同之处的两个重要属性。

LinkedHashMap比HashMap多了两个成员变量,其中header代表内部双向链表的头结点,后面我们就会发现, LinkedHashMap除了有个桶数组
容纳所有Entry之外, 还有一个双向链表保存所有Entry引用。
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值