天天看點

LinkedHashSet的實作原理類結構構造方法增删改查

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的方法。

繼續閱讀