LinkedHashSet,底層都是通過LinkedHashMap實作的,閱讀本博文前請先了解LinkedHashMap。
類結構
public class LinkedHashSet<E>
extends HashSet<E>
implements Set<E>, Cloneable, java.io.Serializable
繼承了HashSet!
構造方法
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);
}
觀察上訴四個構造方法可以發現,都調用了父類HashSet的構造方法。并且都是同一個構造方法。如下:
HashSet(int initialCapacity, float loadFactor, boolean dummy) {
map = new LinkedHashMap<>(initialCapacity, loadFactor);
}
該方法将HashSet中的HashMap成員變量的執行個體類型改成了LinkedHashMap類型。執行個體LinkedHashMap時是調用下述構造方法:
public LinkedHashMap(int initialCapacity,
float loadFactor,
boolean accessOrder) {
super(initialCapacity, loadFactor);
this.accessOrder = accessOrder;
}
可以發現accessOrder一直為true。在LinkedHashMap中,accessOrder的控制雙向連結清單記錄的是請求順序還是插入順序,預設true是插入順序,false是請求順序。是以LinkedHashSet的底層雙向連結清單的按插入順序記錄的。
增删改查
LinkedHashSet的增删改查都是調用HashSet的方法。
HashSet底層實作是調用HashMap的方法。
此時HashSet的HashMap已經被轉化成LinkedHashMap執行個體,
是以,LinkedHashSet的增删改查都是調用LinkedHashMap的方法。