LinkedHashMap内部实现

1、概述

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

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

2、简要描述LinkedHashMap实现

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

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. public class LinkedHashMap<K, V> extends HashMap<K, V> implements Map<K, V>  

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

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

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

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. void init() {    
  2.     header = new Entry<K,V>(-1nullnullnull);    
  3.     header.before = header.after = header;    
  4. }   

3、迭代顺序

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. //true表示按照访问顺序迭代,false时表示按照插入顺序    
  2.  private final boolean accessOrder;  
LinkedHashMap重写了父类的HashMap的get方法:在调用父类的getEntry()方法取得查找的元素之后,再判断排序模式accessOrder是否为true,如果是,那么就把最新访问的元素添加到双向链表的表头,并从原来的位置删除(可以用来实现LRU访问)。因为链表的插入和删除操作都是常量级的时间复杂度,所以不会带来性能损失。

4、总结

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值