Java Set集合詳解及Set與List的區別

Set是什麼?

    Java中的Set集合是繼承Collection的接口,是一個不包含重複元素的集合。

    下圖是Set集合的源碼。


Set和List都是以藉口都形式來進行聲明。Set主要包含三種存放數據類型都變量,分別是HashSet,LinkedHashSet,TreeSet.

HashSet LinkedHashSet TreeSet的主要使用情境

        HashSet,從名稱就可以看出很定是和Hash這樣的數據結構有關,打開HashSet源碼可以看到一個很熟悉到對象驚恐


對 就是它HashMap, 熟不熟悉,意不意外,你以爲和List同在一個Collection下,他們就很不同麼,而且HashSet如果在第一次調用的時候就是new HashMap();

public HashSet(int initialCapacity, float loadFactor) {
    map = new HashMap<>(initialCapacity, loadFactor);
}
public HashSet(Collection<? extends E> c) {
    map = new HashMap<>(Math.max((int) (c.size()/.75f) + 1, 16));
    addAll(c);
}

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

以上是HashSet,1.9版本的的構造器,可見HashSet的底層就是HashMap來構建的並可以添加初始容量和加載因子,來調節反應時間或是空間容量.

public boolean add(E e) {//hashset添加元素,即向hashmap下put元素,這也是爲什麼hashset不會出現重複的元素
    return map.put(e, PRESENT)==null;
}

LinkedHashSet    

        當看到源碼的時候同時是大吃一斤了吧,沒想到,萬萬沒想到竟然不是鏈表加hash加什麼集合,而是:


LinkedHashMap,也就是說這完完全全就是LinkedHashMap的數據結構,並且符合其所有屬性和性質,有序,不可重複。

接下來再看看 TreeSet:

    

從這裏也可以看出TreeSet同樣也是以TreeMap作爲存儲結構,有序,不可重複。

 實際上,可以看出,set的實體類主要就是以map爲基礎,相對應的使用環境和意義也和對應的map相同。

    那爲什麼會構造Set這個集合呢?

    實際上是將map的key-value鍵值對的方式,通過key的唯一的特性,主要將set構建的對象放入key中,以這樣的方式來使用集合遍歷的一些特性。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章