Java集合7——LinkedHashMap实现

本文详细介绍了LinkedHashMap的数据结构和工作原理,包括其实现机制、构造方法、如何维持元素的顺序等,并对比了它与HashMap的区别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

LinkedHashMap简介


我们可以看到LinkedHashMap是继承于HashMap,实现了Map接口

  • 概括的说,LinkedHashMap 是一个于数组加双向链表,它是线程不安全的的,允许key和value都为null 
  • 它继承自HashMap,实现了Map<K,V>接口。其内部还维护了一个双向链表,在每次插入数据,或者访问、修改数据时,会增加节点、或调整链表的节点顺序。以决定迭代时输出的顺序。
  • 默认情况,遍历时的顺序是按照插入节点的顺序。这也是其与HashMap最大的区别。 
  • 也可以在构造时传入accessOrder参数,使得其遍历顺序按照访问的顺序输出。

--------------------------------------------------------------------------------------------------------------------------------

  • 构造方法 
     //accessOrder为true时表示该LinkedHashMap的key为访问顺序
     //accessOrder为false表示该linkedHashMap的key为插入顺序
    private final boolean accessOrder;
    public LinkedHashMap(int initialCapacity, float loadFactor) {
        //调用了父类HashMap的构造方法
        super(initialCapacity, loadFactor);
		//默认为false,也就是插入顺序
        accessOrder = false;
    }
   
    public LinkedHashMap(int initialCapacity) {
	super(initialCapacity);
        accessOrder = false;
    }
   
    public LinkedHashMap() {
	super();
        accessOrder = false;
    }
    
    public LinkedHashMap(Map<? extends K, ? extends V> m) {
        super(m);
        accessOrder = false;
    }

可以通过这个构造函数传参将accessOrder改为true,这时使得其遍历顺序按照访问的顺序输出。

可以 看出这个是按照访问顺序输出的。

 

LinkedHashMap调用了父类的构造方法

可以看出最后调用了一个init()方法,这个方法在HashMap中并没有被实现,它在LinkedHashMap中被实现。

对header进行了初始化

 

  • LinkedHashMap 数据结构——基于数组加双向链表

LinkedHashMap是key键有序的HashMap的一种实现。它除了使用哈希表这个数据结构,使用双向链表来保证key的顺序

LinkedHashMap 在不对HashMap做任何改变的基础上,给HashMap的任意两个节点间加了两条连线(before指针和after指针),使这些节点形成一个双向链表。在LinkedHashMapMap中,所有put进来的Entry都保存在HashMap中,但由于它又额外定义了一个以head为头结点的空的双向链表,因此对于每次put进来Entry还会将其插入到双向链表的尾部。

  • 一些常用方法

put(Key,Value)

对于put(Key,Value)方法而言,LinkedHashMap完全继承了HashMap的 put(Key,Value) 方法,只是对put(Key,Value)方法所调用的recordAccess方法和addEntry方法进行了重写;

此外,在LinkedHashMap的addEntry方法中,它重写了HashMap中的createEntry方法,我们接着看一下createEntry方法:

在LinkedHashMap中向哈希表中插入新Entry的同时,还会通过Entry的addBefore方法将其链入到双向链表中。其中,addBefore方法本质上是一个双向链表的插入操作,其源码如下:

get(Key)。

对于get(Key)方法而言,LinkedHashMap则直接对它进行了重写。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值