LinkedHashMap源码分析

本文深入探讨了LinkedHashMap的内部实现机制,分析了其如何在继承HashMap的基础上,通过链表和红黑树来维护元素的顺序,无论是按访问顺序还是插入顺序。详细解释了初始化过程及节点插入操作的具体流程。

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

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

继承HashMap 并实现了Map的接口

其中HashMap用Node<K,V>[] table;实现了桶,即相当于用数组实现了 List(类似于arraylist)

那么LinkedHashMap源码中是如何实现?

猜测和LinkedList一样也是用链表实现了一个个的桶,那么具体代码实现?

(head 头部   tail wei)

看到一开始的代码中有个static class Entry<K,V>  相比较HashMap的Node多了before和after属性那么也就是说明,猜测应该是成立的LinkedHashMap是用链表+(链表或红黑树)实现?具体方式还需要接着解析源码:

 

那么初始化LinkedHashMap做了什么?

调用了HashMap的 初始化方法 初始一些变量?threshold和loadFactor

 final boolean accessOrder;这个参数是干嘛? 用false表示用于插入顺序 

注释中:

    /**
     * The iteration ordering method for this linked hash map: <tt>true</tt>
     * for access-order(访问顺序), <tt>false</tt> for insertion-order(插入顺序).
     *
     * @serial
     */

可以初始化时指定顺序

那么是如何保证顺序的?

以插入节点为例:

没有重写 故 调用的是hashmap父类的方法:

但此处注意的是 LinkedHashMap自己实现了方法newNode

所以任然调用了HashMap的数组?依旧是用数组+(链表或是二叉树)的实现???

新建了一个Entry<K,V>后 linkNodeLast(p)是干嘛的?

将p指定到尾部?如果尾部为null 则将p指定为head头部,否则将p为原先的tail的尾部,原先的尾部 为当前p的前面元素。

// link at the end of list 按照注释表示 在list的尾部进行链接(对第一个Entry<K,V>链表 至于head)

这个也相同 新建一个树 并至于head和tail

故for each的时候只需要将head进行一直after就好了?未完待续。。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值