LinkedHashSet源码分析

简介

set接口的hash表和链表的实现,和HashSet不一样的地方是维护了一个双向链表记录插入顺序,请注意仅仅是插入顺序。

类图

LinkedHashSet源码分析

代码

-- 你没看错 就这么多代码 关键点在 继承HashSet
public class LinkedHashSet<E> extends HashSet<E>
    implements Set<E>, Cloneable, java.io.Serializable {

    private static final long serialVersionUID = -2851667679971038690L;

	-- 这四个构造调用同一个父类构造
    public LinkedHashSet(int initialCapacity, float loadFactor) {
        super(initialCapacity, loadFactor, true);
    }

    public LinkedHashSet(int initialCapacity) {
        super(initialCapacity, .75f, true);
    }

    public LinkedHashSet() {
        super(16, .75f, true);
    }

    public LinkedHashSet(Collection<? extends E> c) {
        super(Math.max(2*c.size(), 11), .75f, true);
        addAll(c);
    }

    public Spliterator<E> spliterator() {
        return Spliterators.spliterator(this, Spliterator.DISTINCT | Spliterator.ORDERED);
    }
}

--让我们看看 HashSet为LinkedHashSet特意写的构造方法
--权限是包权限 实现是一个LinkedHashMap,最后那个dummy参数只是为了区分其他构造
HashSet(int initialCapacity, float loadFactor, boolean dummy) {
   map = new LinkedHashMap<>(initialCapacity, loadFactor);
}

总结

使用LinkedHashMap实现
有序,按照插入顺序排序