1. 程式人生 > 實用技巧 >Set介面的實現類

Set介面的實現類

1.簡述                                                   

  Set介面和List介面一樣,同樣繼承自Collection介面,它與Collection介面中的方法基本一致,並沒有對Collection介面進行功能上的擴充,只是比Collection介面更加嚴格了。與List介面不同的是,Set介面中元素無序,並且都會以某種規則保證存入的元素不出現重複。

  特點

  • 存入順序和取出順序不一致,不保證順序不變,且元素唯一,底層由HashMap實現。

  Set介面中有以下幾個常用實現類

  • HashSet:無序並且效能比TreeSet高效,適用於基本的新增、查詢元素的場合。
  • TreeSet:採用的二叉樹的資料結構,需要採用紅黑樹演算法維護資料的排序,對Set的資料型別有要求(需要實現Comparable介面或者是在TreeSet構造的時候定義排序),效能較HashSet低效,比較適用於需要保持排序的場景。
  • LinkedHashSet:採用的連結串列維護插入元素的順序,其他與HashSet無太大差異,效能較HashSet略低(連結串列開銷)。
  • EnumSet:這四種常見Set實現類中最高效的,採用的是位向量的資料結構儲存元素(儲存高效、緊湊),要求儲存元素必須是一個Enum(約束大),適用於列舉值執行批量操作的場景。

2.HashSet                                                 

  該類實現了Set介面,不允許出現重複元素,不保證集合中元素的順序,允許包含值為null的元素,但最多隻能一個。對於HashSet而言,HashSet繼承自AbstractSet,它是基於HashMap實現的,HashSet底層使用HashMap來儲存所有元素。因此HashSet的實現比較簡單,相關HashSet的操作,基本上都是直接呼叫底層HashMap 的相關方法來完成。

  定義一個HashSet的方式有如下幾種

//構造一個新的空 set,其底層 HashMap 例項的預設初始容量是 16,載入因子是 0.75。
Set<String> set = new HashSet<String>();
//構造一個包含指定 collection 中的元素的新 set。 set = new HashSet<String>(new ArrayList<String>()); //構造一個新的空 set,其底層 HashMap 例項具有指定的初始容量和預設的載入因子(0.75)。 set = new HashSet<String>(30); //構造一個新的空 set,其底層 HashMap 例項具有指定的初始容量和指定的載入因子。 set = new HashSet<String>(30, 1.2f);
View Code

  HashSet有很多常用方法,add、addAll、remove、clear、size、isEmpty等,關於其他方法可以檢視API。

  HashSet的遍歷方式和ArrayList一樣,這裡就不在陳述了。

3.TreeSet                                                 

  TreeSet是一個有序的集合,它的作用是提供有序的Set集合。它繼承了AbstractSet抽象類,實現了NavigableSet<E>,Cloneable,Serializable介面。TreeSet是基於TreeMap實現的,TreeSet的元素支援2種排序方式,自然排序或者根據提供的Comparator進行排序。

  定義一個TreeSet的方式有如下幾種

//預設建構函式。使用該建構函式,TreeSet中的元素按照自然排序進行排列。
Set<String> set = new TreeSet<String>();
//建立的TreeSet包含collection
set = new TreeSet<String>(new ArrayList<String>());
//指定TreeSet的比較器
set = new TreeSet<String>(new Comparator<String>() {
    public int compare(String o1, String o2) {
        int num = o1.compareTo(o2);                    //比較內容為主要條件
        return num == 0 ? 1 : num;                    //保留重複
    }
});
//建立的TreeSet包含set
SortedSet<String> sortedTreeSet = new TreeSet<String>();
set = new TreeSet<String>(sortedTreeSet);
View Code

  TreeSet有很多常用方法,add、addAll、remove、clear、size、isEmpty等,關於其他方法可以檢視API。

  TreeSet的遍歷方式和ArrayList一樣,這裡就不在陳述了。

4.LinkedHashSet                                             

  相對HashSet來說,LinkedHashSet儲存結構是一個雙向連結串列,因此它儲存的元素是有序的。LinkedHashSet繼承自HashSet,原始碼更少、更簡單,唯一的區別是LinkedHashSet內部使用的是LinkHashMap。這樣做的意義或者好處就是LinkedHashSet中的元素順序是可以保證的,也就是說遍歷序和插入序是一致的。

  定義一個LinkedHashSet的方式有如下幾種

//預設建構函式
Set<String> set = new LinkedHashSet<String>();
//建立的LinkedHashSet包含容量初始化
set = new LinkedHashSet<String>(30);
//建立的LinkedHashSet包含容量和填充比初始化
set = new LinkedHashSet<String>(30, 12.5f);
//將其他型別的集合轉為LinkedHashSet
set = new LinkedHashSet<String>(new ArrayList<String>());
View Code

  LinkedHashSet有很多常用方法,add、addAll、remove、clear、size、isEmpty等,關於其他方法可以檢視API。

  LinkedHashSet的遍歷方式和ArrayList一樣,這裡就不在陳述了。

5.EnumSet                                                

  EnumSet是一個專為列舉設計的集合類,EnumSet中的所有元素都必須是指定列舉型別的列舉值,該列舉型別在建立EnumSet時顯式或隱式地指定。EnumSet的集合元素是有序的,並且不允許加入null元素。EnumSet在內部以位向量的形式儲存,這種儲存形式非常緊湊、高效,因此EnumSet物件佔用記憶體很小,而且執行效率很好。

  EnumSet是抽象類,只能通過靜態工廠方法構造EnumSet物件,具體如下

  • EnumSet<E> noneOf(Class<E> elementType):構造一個空的集合
  • EnumSet<E> allOf(Class<E> elementType):構造一個包含列舉類中所有列舉項的集合
  • EnumSet<E> of(E e):構造包含1個元素的集合
  • EnumSet<E> of(E e1, E e2):構造包含2個元素的集合
  • EnumSet<E> of(E e1, E e2, E e3):構造包含3個元素的集合
  • EnumSet<E> of(E e1, E e2, E e3, E e4):構造包含4個元素的集合
  • EnumSet<E> of(E e1, E e2, E e3, E e4, E e5):構造包含5個元素的集合
  • EnumSet<E> of(E first, E... rest):構造包含多個元素的集合(使用可變引數)
  • EnumSet<E> copyOf(EnumSet<E> s):構造包含引數中所有元素的集合
  • EnumSet<E> copyOf(Collection<E> c):構造包含引數中所有元素的集合

  EnumSet有很多常用方法,add、addAll、remove、clear、size、isEmpty等,關於其他方法可以檢視API。

  EnumSet的遍歷方式和ArrayList一樣,這裡就不在陳述了。