1. LinkedHashSet简介
LinkedHashSet继承自HashSet,故拥有HashSet的全部API,LinkedHashSet内部实现简单,核心参数和方法都继承自HashSet,只是重写了spliterator一个方法。
HashSet底层通过HashMap进行数据存储,而LinkedHashSet则是通过LinkedHashMap进行数据存储,故LinkedHashSet是一个有序的不可重复集合,非线程安全。
2. LinkedHashSet实现
//继承自HashSet,实现了Set、Cloneable、java.io.Serializable接口
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); }
//传入初始容量,加载因子默认0.75 public LinkedHashSet(int initialCapacity) { super(initialCapacity, .75f, true); }
//无参构造,默认初始容量16,加载因子0.75 public LinkedHashSet() { super(16, .75f, true); }
//传入一个集合 public LinkedHashSet(Collection<? extends E> c) {
//初始容量取集合c大小的2倍与11的最大值,加载因子0.75 super(Math.max(2*c.size(), 11), .75f, true);
//将集合内所有元素添加进来 addAll(c); } @Override public Spliterator<E> spliterator() { return Spliterators.spliterator(this, Spliterator.DISTINCT | Spliterator.ORDERED); } }
LinkedHashSet的源码很少,构造方法都是调用的父类HashSet的同一个构造方法,而这个构造方法也只是提供给LinkedHashSet使用的。
LinkedHashSet和HashSet的唯一区别就是底层由LInkedHashMap存储数据,从而保证了有序性。
HashSet(int initialCapacity, float loadFactor, boolean dummy) { map = new LinkedHashMap<>(initialCapacity, loadFactor); }