天天看點

JDK源碼解析---LinkedHashSet

文章目錄

      • 1.概述
      • 2.類圖
      • 3.構造函數

1.概述

LinkedHashSet是Set集合的一個實作,具有set集合不重複的特點,同時具有可預測的疊代順序,也就是我們插入的順序。

底層實作是LinkedHashMap 是以僅在構造方法上和HashSet有所差別

LinkedHashMap和LinkedHashSet都可以做到有序,但是不同點在于。LinkedHashMap可以根據通路順序來通路,也可以根據插入順序來通路。但是LinkedHashSet有序的通路隻能是根據插入順序來通路。

2.類圖

JDK源碼解析---LinkedHashSet

繼承了HashSet 和HashSet的差別就在于構造函數

實作了Set接口、序列化接口、克隆接口

3.構造函數

  1. 給定初始容量和裝載因子的構造函數
public LinkedHashSet(int initialCapacity, float loadFactor) {
    super(initialCapacity, loadFactor, true);
}
           
  1. 給定初始容量的構造函數
public LinkedHashSet(int initialCapacity) {
    super(initialCapacity, .75f, true);
}
           
  1. 無參的構造函數
public LinkedHashSet() {
    super(16, .75f, true);
}
           
  1. 給定初始集合元素的構造函數
public LinkedHashSet(Collection<? extends E> c) {
    super(Math.max(2*c.size(), 11), .75f, true);
    addAll(c);
}
           

以上的4種構造函數都調用了父類的一個構造函數 如下:

​ 其底層實際是一個LinkedHashMap。而之前在解析HashSet源碼的時候就已經發現,基于HashSet的操作基本上都是對内部實作的HashMap進行操作。

是以LinkedHashMap同理。調用的父類提供的api操作内部的LinkedHashSet

HashSet(int initialCapacity, float loadFactor, boolean dummy) {
    map = new LinkedHashMap<>(initialCapacity, loadFactor);
}