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中,以這樣的方式來使用集合遍歷的一些特性。