LinkedHashMap

LinkedHashMap是HashMap的子类,通过维护双向链表实现元素的插入顺序和访问顺序。插入节点时,通过覆写newNode方法创建Entry并添加到链表尾部。删除节点时,父类删除逻辑后,通过afterNodeRemoval回调方法从链表中移除。设置accessOrder为true,按访问顺序维护链表。
摘要由CSDN通过智能技术生成

1.概述

LinkedHashMap 继承自 HashMap,在 HashMap 基础上,通过维护一条双向链表,解决了 HashMap 不能随时保持遍历顺序和插入顺序一致的问题。除此之外,LinkedHashMap 对访问顺序也提供了相关支持。在一些场景下,该特性很有用,比如缓存。在实现上,LinkedHashMap 很多方法直接继承自 HashMap,仅为维护双向链表覆写了部分方法 。

在这里插入图片描述

2.原理

LinkedHashMap在HashMap的基础上,增加一条双向链表,使得键值对能保持插入的顺序,同时通过对链表进行相应的操作,实现了访问顺序的相关逻辑
在这里插入图片描述

3.源码分析

3.1 Entry的继承体系

在这里插入图片描述

3.2链表的建立过程

链表的建立过程是在插入键值对节点时开始的,初始情况下,让 LinkedHashMap 的 head 和 tail 引用同时指向新节点,链表就算建立起来了。随后不断有新节点插入,通过将新节点接在 tail 引用指向节点的后面,即可实现链表的更新。

Map 类型的集合类是通过 put(K,V) 方法插入键值对,LinkedHashMap 本身并没有覆写父类的 put 方法,而是直接使用了父类的实现。但在 HashMap 中,put 方法插入的是 HashMap 内部类 Node 类型的节点,该类型的节点并不具备与 LinkedHashMap 内部类 Entry 及其子类型节点组成链表的能力,那么,LinkedHashMap 是怎样建立链表的呢?

public V put(K key, V value) {
   
        return putVal(hash(key), key, value, false, true);
    }

 final V putVal(int hash, K key, V value, boolean onlyIfAbsent,
                   boolean evict) {
   
    
        if ((p = tab[i = (n - 1) & hash]) == null)
            tab[i] = newNode(hash, key, value, null);//LinkedHashMap重写

       
            if (e != null) {
    // existing mapping for key
                V oldValue = e.value;
                if (!onlyIfAbsent || oldValue == null)
                    e.value = value;
                afterNodeAccess(e);//LinkedHashMap重写
                return oldValue;
            }
        }

        //modCount:表示散列表结构被修改的次数,替换Node元素的value不计数
        ++modCount;
        //插入新元素,size自增,如果自增后的值大于扩容阈值,则触发扩容。
        if (++size > threshold)
            resize();
        afterNodeInsertion(evict);//LinkedHashMap重写
        return null;
    }

// LinkedHashMap 中实现
Node<K,V> newNode(int hash, K key, V value, Node
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值