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 数组位置是随机的,但由于双向链表,使得存入顺序与取出顺序一致

posted @   半条咸鱼  阅读(27)  评论(0编辑  收藏  举报
(评论功能已被禁用)
相关博文:
阅读排行:
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
点击右上角即可分享
微信分享提示