1. 程式人生 > 其它 >【Java提高十七】Set介面集合詳解

【Java提高十七】Set介面集合詳解

三、Set介面

Set是一種不包括重複元素的Collection。它維持它自己的內部排序,所以隨機訪問沒有任何意義。與List一樣,它同樣執行null的存在但是僅有一個。由於Set介面的特殊性,所有傳入Set集合中的元素都必須不同,同時要注意任何可變物件,如果在對集合中元素進行操作時,導致e1.equals(e2)==true,則必定會產生某些問題。實現了Set介面的集合有:EnumSet、HashSet、TreeSet。

3.1、EnumSet

是列舉的專用Set。所有的元素都是列舉型別。

3.2、HashSet

HashSet堪稱查詢速度最快的集合,因為其內部是以HashCode來實現的。它內部元素的順序是由雜湊碼來決定的,所以它不保證set 的迭代順序;特別是它不保證該順序恆久不變。


HashSet詳解

對於HashSet而言,它是基於HashMap來實現的,底層採用HashMap來儲存元素。所以如果對HashMap比較熟悉,那麼HashSet是so easy!!

一、定義

HashSet繼承AbstractSet類,實現Set、Cloneable、Serializable介面。其中AbstractSet提供 Set 介面的骨幹實現,從而最大限度地減少了實現此介面所需的工作。Set介面是一種不包括重複元素的Collection,它維持它自己的內部排序,所以隨機訪問沒有任何意義。

基本屬性

建構函式

從建構函式中可以看出HashSet所有的構造都是構造出一個新的HashMap,其中最後一個建構函式,為包訪問許可權是不對外公開,僅僅只在使用LinkedHashSet時才會發生作用。

二、方法

既然HashSet是基於HashMap,那麼對於HashSet而言,其方法的實現過程是非常簡單的。

iterator()方法返回對此 set 中元素進行迭代的迭代器。返回元素的順序並不是特定的。底層呼叫HashMap的keySet返回所有的key,這點反應了HashSet中的所有元素都是儲存在HashMap的key中,value則是使用的PRESENT物件,該物件為static final。

size()返回此 set 中的元素的數量(set 的容量)。底層呼叫HashMap的size方法,返回HashMap容器的大小。

isEmpty(),判斷HashSet()集合是否為空,為空返回 true,否則返回false。

contains(),判斷某個元素是否存在於HashSet()中,存在返回true,否則返回false。更加確切的講應該是要滿足這種關係才能返回true:(o==null ? e==null : o.equals(e))。底層呼叫containsKey判斷HashMap的key值是否為空。

add()如果此 set 中尚未包含指定元素,則新增指定元素。如果此Set沒有包含滿足(e==null ? e2==null : e.equals(e2)) 的e2時,則將e2新增到Set中,否則不新增且返回false。由於底層使用HashMap的put方法將key = e,value=PRESENT構建成key-value鍵值對,當此e存在於HashMap的key中,則value將會覆蓋原有value,但是key保持不變,所以如果將一個已經存在的e元素新增中HashSet中,新新增的元素是不會儲存到HashMap中,所以這就滿足了HashSet中元素不會重複的特性。

remove如果指定元素存在於此 set 中,則將其移除。底層使用HashMap的remove方法刪除指定的Entry。

clear從此 set 中移除所有元素。底層呼叫HashMap的clear方法清除所有的Entry。

clone返回此 HashSet 例項的淺表副本:並沒有複製這些元素本身。

後記:

由於HashSet底層使用了HashMap實現,使其的實現過程變得非常簡單,如果你對HashMap比較瞭解,那麼HashSet簡直是小菜一碟。有兩個方法對HashMap和HashSet而言是非常重要的,hashcode和equals。


3.3、TreeSet

基於TreeMap,生成一個總是處於排序狀態的set,內部以TreeMap來實現。它是使用元素的自然順序對元素進行排序,或者根據建立Set 時提供的 Comparator 進行排序,具體取決於使用的構造方法。


TreeSet詳解

一、TreeSet定義

我們知道TreeMap是一個有序的二叉樹,那麼同理TreeSet同樣也是一個有序的,它的作用是提供有序的Set集合。通過原始碼我們知道TreeSet基礎AbstractSet,實現NavigableSet、Cloneable、Serializable介面。其中AbstractSet提供 Set 介面的骨幹實現,從而最大限度地減少了實現此介面所需的工作。NavigableSet是擴充套件的 SortedSet,具有了為給定搜尋目標報告最接近匹配項的導航方法,這就意味著它支援一系列的導航方法。比如查詢與指定目標最匹配項。Cloneable支援克隆,Serializable支援序列化。

同時在TreeSet中定義瞭如下幾個變數。

其構造方法:

二、TreeSet主要方法

1、add:將指定的元素新增到此 set(如果該元素尚未存在於 set 中)。

2、addAll:將指定 collection 中的所有元素新增到此 set 中。

3、ceiling:返回此 set 中大於等於給定元素的最小元素;如果不存在這樣的元素,則返回 null。

4、clear:移除此 set 中的所有元素。

5、clone:返回 TreeSet 例項的淺表副本。屬於淺拷貝。

6、comparator:返回對此 set 中的元素進行排序的比較器;如果此 set 使用其元素的自然順序,則返回 null。

7、contains:如果此 set 包含指定的元素,則返回 true。

8、descendingIterator:返回在此 set 元素上按降序進行迭代的迭代器。

9、descendingSet:返回此 set 中所包含元素的逆序檢視。

10、first:返回此 set 中當前第一個(最低)元素。

11、floor:返回此 set 中小於等於給定元素的最大元素;如果不存在這樣的元素,則返回 null。

12、headSet:返回此 set 的部分檢視,其元素嚴格小於 toElement。

13、higher:返回此 set 中嚴格大於給定元素的最小元素;如果不存在這樣的元素,則返回 null。

14、isEmpty:如果此 set 不包含任何元素,則返回 true。

15、iterator:返回在此 set 中的元素上按升序進行迭代的迭代器。

16、last:返回此 set 中當前最後一個(最高)元素。

17、lower:返回此 set 中嚴格小於給定元素的最大元素;如果不存在這樣的元素,則返回 null。

18、pollFirst:獲取並移除第一個(最低)元素;如果此 set 為空,則返回 null。

19、pollLast:獲取並移除最後一個(最高)元素;如果此 set 為空,則返回 null。

20、remove:將指定的元素從 set 中移除(如果該元素存在於此 set 中)。

21、size:返回 set 中的元素數(set 的容量)。

22、subSet:返回此 set 的部分檢視

23、tailSet:返回此 set 的部分檢視

三、最後

由於TreeSet是基於TreeMap實現的,所以如果我們對treeMap有了一定的瞭解,對TreeSet那是小菜一碟,我們從TreeSet中的原始碼可以看出,其實現過程非常簡單,幾乎所有的方法實現全部都是基於TreeMap的。