LinkedHashSet 类
1、是 HashSet 的子类,不允许重复元素、允许最多一个 null 元素
2、底层是 LinkedHashMap,维护:HashMap + 双向链表
3、双向链表维护元素次序
(1)插入有序:先添加在前,后添加在后,修改不影响顺序
(2)访问有序:get / put 操作,其对应键值对移到链表末尾,最末尾是最近访问,最开始是最久未访问
底层
1、无参构造器,
private transient HashMap<E,Object> map;
(1)跳转到 HashSet 类,默认初始容量为 16
public LinkedHashSet() {
super(16, .75f, true);
}
(2)底层组合 LinkedHashMap 对象
HashSet(int initialCapacity, float loadFactor, boolean dummy) {
map = new LinkedHashMap<>(initialCapacity, loadFactor);
}
2、维护 head、tail,分别指向双向链表的头节点、尾节点
transient LinkedHashMap.Entry<K,V> head;
transient LinkedHashMap.Entry<K,V> tail;
3、每个 Entry 节点,都有 before、after,分别指向前一个节点、后一个节点,以形成双向链表
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);
}
}
4、添加、扩容机制与 HashSet 一致
5、key 存放索引的算法与 HashSet 一致,即在 table 数组位置是随机的,但由于双向链表,使得存入顺序与取出顺序一致
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战