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 源码