【JDK1.8源码阅读】 LinkHashMap源码实现分析整理(二)

本文详细分析了LinkHashMap的数据结构,包括双向链表的实现,以及类定义、节点插入、访问和移除的回调机制。通过对`linkNodeLast`、`afterNodeAccess`、`afterNodeRemoval`和`afterNodeInsertion`方法的探讨,揭示了LinkHashMap如何维持元素的插入顺序,并可应用于LRU算法。同时,还介绍了`entrySet`的遍历方式。
摘要由CSDN通过智能技术生成

LinkHashMap数据结构分析

LinkHashMap相对HashMap,记录了元素的插入顺序,在遍历时,可以根据元素的插入顺序进行反问,LinkHashMap的顺序是基于双向链表实现的,因而LinkHashMap同时具备栈和队列的基础功能。

数据结构如下:
image

LinkedHashMap会将元素串起来,形成一个双链表结构。可以看到,其结构在HashMap结构上增加了链表结构。数据结构为(数组 + 单链表 + 红黑树 + 双链表),图中的标号是结点插入的顺序。注意,在图中未展现出红黑树的特征,这个可以参照HashMap的数据结构。

类定义

下面先看看LinkedHashMap的基本成员属性,具体源码如下:

public class LinkedHashMap<K,V>  extends HashMap<K,V> implements Map<K,V> {
   
    static class Entry<K,V> extends HashMap.Node<K,V> {
   
        Entry<K,V> before, after;
        Entry(int hash, K key, V value, Node<K,V> next) {
   
            super(hash, key, value, next);
        }
    }

    // 链表头结点
    transient LinkedHashMap.Entry<K,V> head;

    // 链表尾结点
    transient LinkedHashMap.Entry<K,V> tail;

    // 访问顺序,如果为false,表示根据插入顺序进行访问
    // 如果为true表示之后访问顺序按照元素的访问顺序进行,不按照之前的插入顺序。
    final boolean accessOrder;
}

从源码中看到,LinkedHashMap中定义了Entry内部类,继承自HashMap.Node节点,具备Node的相关特性,同时还定义了Entry<K,V> before, after;,根据插入顺序用于索引遍历成员元素,在LinkedHashMap内部还定义了head和tail成员属性,用于记录整个双向链表的收尾节点,用于实现双向遍历。

LinkedHashMap继承自HashMap,具有HashMap的全部特性,下面结合源码分析LinkedHashMap的双向链表特性

linkNodeLast 插入双链表尾部

LinkedHashMap重写了HashMap的newNode和newTreeNode方法:

// 当桶中结点类型为HashMap.Node类型时,调用此函数
Node<K,V> newNode(int hash, K key, V value, Node<K,V> e) {
   
    // 生成Node结点
    LinkedHashMap.Entry<K,V> p =
        new LinkedHashMap
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值