1. 程式人生 > >Java Set集合詳解及Set與List的區別

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

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相同。