1. 程式人生 > 實用技巧 >Java學習 - Set使用

Java學習 - Set使用

Java Set 用法

Java 的set介面由兩種類實現,一種是底層基於散列表的HashSet,另一種是底層基於紅黑樹的TreeSet。此外,HashSet還有派生類LinkedHashSet。

set代表的是數學上的集合的意思,所以set中的元素不可以重複
所以set中查詢是最為重要的操作。

HashSet, LinkedHashSet 以及 TreeSet之間的區別

效能和速度:他們之間的第一個區別來自速度,HashSet 是最快的,LinkedHashSet 在效能方面排第二,或者近乎接近於HashSet,TreeSet稍微慢一些,因為每一次插入元素都需要執行排序操作。TreeSet 對於常見操作如add,remove,contains等能夠保證時間複雜度為 O(log(n)) ,而 HashSet 和 LinkedHashSet 對於add,contains,remove等操作提供時間複雜度為常數時間的效能,因為HashSet為給定雜湊函式在桶中均勻分配元素。

排序性:HashSet 不保證元素的任何順序,而LinkedHashSet 保持元素的插入順序,更多的像List介面一樣,TreeSet 按照元素實現的比較介面保持元素的順序。

內部實現:HashSet底層基於一個HashMap例項,LinkedHashSet 基於HashSet和LinkedList實現,TreeSet底層基於NavigableMap介面實現,java中預設用TreeMap實現。

null值:HashSet 和 LinkedHashSet允許null值,但是TreeSet 不支援null值,並且當你向TreeSet中插入null值時會丟擲 java.lang.NullPointerException 異常。因為TreeSet應用 compareTo() 方法於各個元素來比較他們,當比較null值時會丟擲 NullPointerException異常。

比較(Comparison ):HashSet 和 LinkedHashSet 用 equals() 方法用於比較,但是TreeSet 用 compareTo() 方法用於維持元素順序。這就是為什麼在java中compareTo()和 equals() 必須保持一致,否則會打破Set介面的一些通用規則,比如可能會允許重複值。

何時用 HashSet, TreeSet 以及 LinkedHashSet

所有三種Set介面實現都可以用於通用的Set操作,比如不允許重複元素,但是三者又都有其獨特的特性,所以在特定的環境下可以有更合適的選擇。 由於TreeSet保持元素順序,所以當你需要一個集合保持元素順序並且不允許重複元素時,可以使用TreeSet;HashSet是通用的Set集合實現,如果你需要一個效率比較快、且不允許重複元素的集合,則可以使用HashSet;LinkedHashSet 是HashSet的擴充套件,它更適合當你需要保持元素的插入順序時使用,更像一個不犧牲昂貴效能的List。LinkedHashSet 的另一個用法是用於建立一個已經存在的Set集合的副本,因為LinkedHashSet 保持插入順序,它返回包含同一順序的相同元素的集合,更像精確的複製。總之,儘管他們三個都是Set介面的實現,但是他們均有各自獨特的特性,HashSet是一個通用功能的Set,而LinkedHashSet 提供元素插入順序保證,TreeSet是一個SortedSet實現,由Comparator 或者 Comparable指定的元素順序儲存元素。

Set 的使用

建立方式

HashSet<Integer> st = new HashSet<Integer>();

插入元素

st.add(...); 

刪除元素

st.remove(...);

存在性判斷

st.contains(...); // 返回boolean

判空

st.isEmpty(); // 返回boolean 

容量

st.size(); // 返回邏輯大小