閱讀本節內容需要讀者對 HashMap 、HashSet 和 LinkedHashMap 的源碼有所瞭解,因爲 LinkedHashSet 的內部實現都是來自於這三個容器類,其內部源碼十分簡單,簡單到它只有一個成員變量、四個構造函數、一個 Set 接口的方法
如果你想多瞭解下這三個容器類,可以從這裏獲得:Java集合框架源碼解析
LinkedHashSet 的所有源碼如下所示
package java.util;
public class LinkedHashSet<E>
extends HashSet<E>
implements Set<E>, Cloneable, java.io.Serializable {
//序列化ID
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);
}
//並行遍歷迭代器
@Override
public Spliterator<E> spliterator() {
return Spliterators.spliterator(this, Spliterator.DISTINCT | Spliterator.ORDERED);
}
}
LinkedHashSet 繼承於 HashSet,而 LinkedHashSet 調用的父類構造函數均是
private transient HashMap<E,Object> map;
HashSet(int initialCapacity, float loadFactor, boolean dummy) {
map = new LinkedHashMap<>(initialCapacity, loadFactor);
}
即 LinkedHashSet 底層是依靠 LinkedHashMap 來實現數據存取的,而 LinkedHashMap 繼承於 HashMap,在內部自己維護了一條雙向鏈表用於保存元素的插入順序,因此使得 LinkedHashSet 也具有了存取有序,元素唯一的特點
關於 LinkedHashSet 的源碼實在也沒什麼好講的,它的實現都是依靠其他容器類來組合支持的,所以如果想了解 LinkedHashSet ,就只能先去了解 HashMap 、HashSet 和 LinkedHashMap 的源碼
如果想多瞭解一些 Java 的集合框架源碼解析,可以看這裏:Java集合框架源碼解析