LinkedHashMap和LinkedHashSet源码解析

本文详细探讨了LinkedHashMap和LinkedHashSet的实现原理和应用场景。LinkedHashMap作为HashMap的子类,维持元素的插入或访问顺序,适用于配置文件、购物车等场景。其内部结合双向链表和哈希表保持顺序。而LinkedHashSet利用LinkedHashMap保持插入顺序,是HashSet的一个有序实现。
摘要由CSDN通过智能技术生成

参考:
Java编程的逻辑
https://blog.csdn.net/blingfeng/article/details/79974169

LinkedHashMap(JDK1.8)

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

是HashMap的子类,但可以保持元素按插入或访问有序,这与TreeMap按键排序不同

内部多了一个双向链表维护键值对的顺序,每个键值对既位于哈希表中,也位于这个双向链表中。

1 应用场景

  • 保持插入顺序

比如一个配置文件,其中有一些键值对形式的配置项,但其中有一些键是重复的,希望保留最后一个值,但还是按原来的键顺序输出,LinkedHashMap就是一个合适的数据结构。

比如希望的数据模型可能就是一个Map,但希望保持添加的顺序;
比如一个购物车,键为购买项目,值为购买数量,按用户添加的顺序保存。

希望Map能够按键有序,但在添加到Map前,键已经通过其他方式排好序了,这时,就没有必要使用TreeMap了,毕竟TreeMap的开销要大一些。
比如,在从数据库查询数据放到内存时,可以使用SQL的order by语句让数据库对数据排序。

  • 保持访问有序

LRU缓存

2 实现原理

2.1 内部组成

transient LinkedHashMap.Entry<K,V> head;//双向链表的头
transient LinkedHashMap.Entry<K,V> tail;//双向链表的尾
final boolean accessOrder;//表示是按访问顺序还是插入顺序
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);
    }
}

2.2 构造方法

//accessOrder默认为false,即按照插入顺序来连接,true则为按照访问顺序来连接
public LinkedHashMap(int initialCapacity, float loadFactor) 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值