LinkedHashSet 源码解析

本文详细介绍了LinkedHashSet,它是HashSet的子类,基于LinkedHashMap实现,保证了元素的插入顺序或访问顺序。LinkedHashSet支持null元素,单线程安全,但多线程环境下不安全。文章通过源码分析,揭示了其构造方法和内部工作机制,并提供了可拆分迭代器的实现。

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

1、简述
  • 本篇内容我们来聊聊我们日常开发中经常使用的一个类 LinkedHashSet,相信大家都不陌生。
2、归纳
  • 继承于 HashSet,基于 LinkedHashMap 实现的,有序(插序),不可重复,允许 null 的存在。
  • 默认容量为16,负载因子0.75,其实内部就是包装了一个 HashMap,HashMap 的 key 放的是其存入的值,value 放的是一个 Object 对象。
  • 单线程安全,多线程不安全。
3、分析
  • 由于 LinkedHashSet 源码较小,主要功能都在 HashSet 和 HashMap 类已经实现,所以咱们直接看源码。
public class LinkedHashSet<E> extends HashSet<E>
        implements Set<E>, Cloneable, java.io.Serializable {

    // 序列化唯一表示 UID
    private static final long serialVersionUID = -2851667679971038690L;

    /**
     * 无参构造方法
     * 默认容量为16,加载因子为0.75,accessOrder 为 true
     */
    public LinkedHashSet() {
        super(16, .75f, true);
    }

    /**
     * 有参构造函数
     * 加载因子为0.75,accessOrder 为 true
     *
     * @param initialCapacity 初始容量
     */
    public LinkedHashSet(int initialCapacity) {
        super(initialCapacity, .75f, true);
    }

    /**
     * 有参构造函数
     * accessOrder 为 true
     *
     * @param initialCapacity 初始容量
     * @param loadFactor      加载因子
     */
    public LinkedHashSet(int initialCapacity, float loadFactor) {
        super(initialCapacity, loadFactor, true);
    }

    /**
     * 有参构造函数
     *
     * @param c 其中的元素将存放在此 set 中的 collection
     */
    public LinkedHashSet(Collection<? extends E> c) {
        super(Math.max(2 * c.size(), 11), .75f, true);
        addAll(c);
    }

    /**
     * 可拆分迭代器,用于遍历数据
     *
     * @return 返回可拆分迭代器
     */
    @Override
    public Spliterator<E> spliterator() {
        return Spliterators.spliterator(this, Spliterator.DISTINCT | Spliterator.ORDERED);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值