【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的。