LinkedHashSet繼承自HashSet,故擁有HashSet的所有API,LinkedHashSet內部實現簡單,核心參數和方法都繼承自HashSet,只是重寫了spliterator一個方法。java
HashSet底層經過HashMap進行數據存儲,而LinkedHashSet則是經過LinkedHashMap進行數據存儲,故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使用的。ide
LinkedHashSet和HashSet的惟一區別就是底層由LInkedHashMap存儲數據,從而保證了有序性。this
HashSet(int initialCapacity, float loadFactor, boolean dummy) { map = new LinkedHashMap<>(initialCapacity, loadFactor); }