LinkedHashSet 源码分析

424 阅读1分钟
LinkedHashSet 源码分析
public class LinkedHashSet<E>
        extends HashSet<E>
        implements Set<E>, Cloneable, java.io.Serializable {

    private static final long serialVersionUID = -2851667679971038690L;

    /**
     * 调用了 HashSet 的构造方法,出入了初始化容量和装载因子,底层实现是 LinkedHashMap
     *
     * @param initialCapacity
     * @param loadFactor
     */
    public LinkedHashSet(int initialCapacity, float loadFactor) {
        super(initialCapacity, loadFactor, true);
    }

    /**
     * 传入指定容量和默认的装载因子去创建 LinkedHashMap
     *
     * @param initialCapacity
     */
    public LinkedHashSet(int initialCapacity) {
        super(initialCapacity, .75f, true);
    }

    /**
     * 使用默认的容量和装载因子创建 LinkedHashMap
     */
    public LinkedHashSet() {
        super(16, .75f, true);
    }

    /**
     * 根据集合创建 LinkedHashMap 默认容量为 11 或者为 2 倍集合长度的数量
     *
     * @param c
     */
    public LinkedHashSet(Collection<? extends E> c) {
        super(Math.max(2 * c.size(), 11), .75f, true);
        // 将数据一个一个的放入 LinkedHashMap
        addAll(c);
    }

    /**
     * 可分割的迭代器,主要用于并发时并行迭代使用
     *
     * @return
     */
    @Override
    public Spliterator<E> spliterator() {
        return Spliterators.spliterator(this, Spliterator.DISTINCT | Spliterator.ORDERED);
    }
}

总结

  • LinkedHashSet 底层使用 LinkedHashMap 来存储元素

  • 不同于 HashSet 的地方在

    • 根据集合创建的时候,HashSet 指定的容量大小是 *1.75 倍,而 LinkedHashSet 是 2 倍

    • 根据集合创建的时候,HashSet 默认是 16 而 LinkedHashSet 是 11

    • HashSet 底层实现是 HashMap,LinkedHashSet 底层实现是 LinkedHashMap

    • HashSet 是无序的,LinkedHashSet 是根据插入值的顺序排序的,详情请看 LinkedHashMap 源码