LinkHashMap源码

本文详细解析了LinkedHashMap的源码,包括其存储结构、继承体系和关键方法。LinkedHashMap结合了HashMap和双向链表,提供按插入顺序或访问顺序访问元素的能力。当accessOrder为true时,它可以实现LRU缓存策略,通过afterNodeAccess()方法将最近访问的元素移至链表尾部,优先淘汰最近最少使用的元素。
摘要由CSDN通过智能技术生成

简介

LinkedHashMap内部维护了一个双向链表,能保证元素按插入的顺序访问,也能以访问顺序访问,可以用来实现LRU缓存策略。 LinkedHashMap可以看成是 LinkedList + HashMap。

继承体系

LinkedHashMap继承HashMap,拥有HashMap的所有特性,并且额外增加了按一定顺序访问的特性。

存储结构

我们知道HashMap使用(数组 + 单链表 + 红黑树)的存储结构,那LinkedHashMap是怎么存储的呢? 通过上面的继承体系,我们知道它继承了HashMap,所以它的内部也有这三种结构,但是它还额外添加了一种“双向链表”的结构存储所有元素的顺序。 添加删除元素的时候需要同时维护在HashMap中的存储,也要维护在LinkedList中的存储,所以性能上来说会比HashMap稍慢。

源码解析

属性

/**
* 双向链表头节点 
*/
transient LinkedHashMap.Entry<K,V> head;

/**
* 双向链表尾节点 
*/
transient LinkedHashMap.Entry<K,V> tail;

/**
* 是否按访问顺序排序 
*/
final boolean accessOrder;

复制代码

内部类

// 位于LinkedHashMap中
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);
    }
}

// 位于HashMap中
static class Node<K, V> implements Map.Entry<K, V> {
    final int hash;
    final K key;
    V value;
    Node<K, V> next;
}

复制代码

存储节点,继承自H

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值