java基础集合类之set
Set也是Collection的一種擴展,而與List不同的時,在Set中的對象元素不能重復(fù)。Set的常用具體實現(xiàn)有HashSet和TreeSet類。
一、HashSet和TreeSet類的區(qū)別
HashSet能快速定位一個元素,但是你放到HashSet中的對象需要實現(xiàn)hashCode()方法,它使用了哈希碼的算法。而TreeSet則將放入其中的元素按序存放,這就要求你放入其中的對象是可排序的,這就用到了集合框架提供的另外兩個實用類Comparable和Comparator。一個類是可排序的,它就應(yīng)該實現(xiàn)Comparable接口。有時多個類具有相同的排序算法,那就不需要在每分別重復(fù)定義相同的排序算法,只要實現(xiàn)Comparator接口即可。集合框架中還有兩個很實用的公用類:Collections和Arrays。Collections提供了對一個Collection容器進行諸如排序、復(fù)制、查找和填充等一些非常有用 的方法,Arrays則是對一個數(shù)組進行類似的操作。
二、Comparable接口和Comparator接口
在“集合框架”中有兩種比較接口:Comparable接口和Comparator接口。像String和Integer等Java內(nèi)建類實現(xiàn)Comparable接口以提供一定排序方式,但這樣只能實現(xiàn)該接口一次。對于那些沒有實現(xiàn)Comparable接口的類、或者自定義的類,你可以通過Comparator接口來定義您自己的比較方式。
1.Comparable接口:
int compareTo(Object o): 比較當(dāng)前實例對象與對象o,如果位于對象o之前,返回負(fù)值,如果兩個對象在排序中位置相同,則返回0,如果位于對象o后面,則返回正值。
JDK中實現(xiàn)了Comparable接口的類的排序方式
(1)按數(shù)字大小排序:BigDecimal,BigInteger,Byte, Double, Float,Integer,Long,Short
(2)按 Unicode 值的數(shù)字大小排序:Character
(3)按字符串中字符 Unicode 值排序:String
利用Comparable接口創(chuàng)建您自己的類的排序順序,需要實現(xiàn)compareTo()方法。通常就是依賴幾個數(shù)據(jù)成員的自然排序。同時類也應(yīng)該覆蓋equals()和hashCode()以確保兩個相等的對象返回同一個哈希碼。
2.Comparator接口:
若一個類不能用于實現(xiàn)java.lang.Comparable,或者不需要缺省的Comparable行為并想提供自己的排序順序(可能多種排序方式),你可以實現(xiàn)Comparator接口,從而定義一個比較器。
(1)int compare(Object o1, Object o2): 對兩個對象o1和o2進行比較,如果o1位于o2的前面,則返回負(fù)值,如果在排序順序中認(rèn)為o1和o2是相同的,返回0,如果o1位于o2的后面,則返回正值
注釋:與Comparable相似,0返回值不表示元素相等。一個0返回值只是表示兩個對象排在同一位置。由Comparator用戶決定如何處理。如果兩個不相等的元素比較的結(jié)果為零,您首先應(yīng)該確信那就是您要的結(jié)果,然后記錄行為。
(2)boolean equals(Object obj): 指示對象obj是否和比較器相等。
注釋:該方法覆寫Object的equals()方法,檢查的是Comparator實現(xiàn)的等同性,不是處于比較狀態(tài)下的對象。
三、SortedSet接口
1.集合框架提供了個特殊的Set接口:SortedSet,它保持元素的有序順序。SortedSet接口為集的視圖(子集)和它的兩端(即頭和尾) 提供了訪問方法。當(dāng)您處理列表的子集時,更改視圖會反映到源集。此外,更改源集也會反映在子集上。發(fā)生這種情況的原因在于視圖由兩端的元素而不是下標(biāo)元素 指定,所以如果您想要一個特殊的高端元素(toElement)在子集中,您必須找到下一個元素。
添加到SortedSet實現(xiàn)類的元素必須實現(xiàn)Comparable接口,否則您必須給它的構(gòu)造函數(shù)提供一個Comparator接口的實現(xiàn)。TreeSet類是它的唯一一份實現(xiàn)。
2.因為集必須包含唯一的項,如果添加元素時比較兩個元素導(dǎo)致了0返回值(通過Comparable的compareTo()方法或Comparator 的compare()方法),那么新元素就沒有添加進去。如果兩個元素相等,那還好。但如果它們不相等的話,您接下來就應(yīng)該修改比較方法,讓比較方法和 equals() 的效果一致。
3.常用函數(shù):
(1) Comparator comparator(): 返回對元素進行排序時使用的比較器,如果使用Comparable接口的compareTo()方法對元素進行比較,則返回null
(2) Object first(): 返回有序集合中第一個(最低)元素
(3) Object last(): 返回有序集合中最后一個(最高)元素
(4)SortedSet subSet(Object fromElement, Object toElement): 返回從fromElement(包括)至toElement(不包括)范圍內(nèi)元素的SortedSet視圖(子集)
(5) SortedSet headSet(Object toElement): 返回SortedSet的一個視圖,其內(nèi)各元素皆小于toElement
(6) SortedSet tailSet(Object fromElement): 返回SortedSet的一個視圖,其內(nèi)各元素皆大于或等于fromElement
四、AbstractSet抽象類
AbstractSet類覆蓋了Object類的equals()和hashCode()方法,以確保兩個相等的集返回相同的哈希碼。若兩個集大小相等 且包含相同元素,則這兩個集相等。按定義,集的哈希碼是集中元素哈希碼的總和。因此,不論集的內(nèi)部順序如何,兩個相等的集會有相同的哈希碼。
五、Set有關(guān)類的常用函數(shù)
1.HashSet的常用函數(shù):
(1)HashSet(): 構(gòu)建一個空的哈希集
(2)HashSet(Collection c): 構(gòu)建一個哈希集,并且添加集合c中所有元素
(3)HashSet(int initialCapacity): 構(gòu)建一個擁有特定容量的空哈希集
(4)HashSet(int initialCapacity, float loadFactor): 構(gòu)建一個擁有特定容量和加載因子的空哈希集。LoadFactor是0.0至1.0之間的一個數(shù)
2.TreeSet的常用函數(shù):
(1)TreeSet():構(gòu)建一個空的樹集
(2)TreeSet(Collection c): 構(gòu)建一個樹集,并且添加集合c中所有元素
(3)TreeSet(Comparator c): 構(gòu)建一個樹集,并且使用特定的比較器對其元素進行排序
(4)TreeSet(SortedSet s): 構(gòu)建一個樹集,添加有序集合s中所有元素,并且使用與有序集合s相同的比較器排序
3.LinkedHashSet的常用函數(shù)
(1) LinkedHashSet(): 構(gòu)建一個空的鏈接式哈希集
(2) LinkedHashSet(Collection c): 構(gòu)建一個鏈接式哈希集,并且添加集合c中所有元素
(3) LinkedHashSet(int initialCapacity): 構(gòu)建一個擁有特定容量的空鏈接式哈希集
(4) LinkedHashSet(int initialCapacity, float loadFactor): 構(gòu)建一個擁有特定容量和加載因子的空鏈接式哈希集。LoadFactor是0.0至1.0之間的一個數(shù)
六、Hash表簡介
1.Hash表是一種數(shù)據(jù)結(jié)構(gòu),用來查找對象。Hash表為每個對象計算出一個整數(shù),稱為Hash Code(哈希碼)。Hash表是個鏈接式列表的陣列。每個列表稱為一個buckets(哈希表元)。對象位置的計算index = HashCode % buckets (HashCode為對象哈希碼,buckets為哈希表元總數(shù))。
2.當(dāng)你添加元素時,有時你會遇到已經(jīng)填充了元素的哈希表元,這種情況稱為Hash Collisions(哈希沖突)。這時,你必須判斷該元素是否已經(jīng)存在于該哈希表中。
3.如果哈希碼是合理地隨機分布的,并且哈希表元的數(shù)量足夠大,那么哈希沖突的數(shù)量就會減少。同時,你也可以通過設(shè)定一個初始的哈希表元數(shù)量來更好地控制哈 希表的運行。初始哈希表元的數(shù)量為buckets = size * 150% + 1 (size為預(yù)期元素的數(shù)量)。
如果哈希 表中的元素放得太滿,就必須進行rehashing(再哈希)。再哈希使哈希表元數(shù)增倍,并將原有的對象重新導(dǎo)入新的哈希表元中,而原始的哈希表元被刪 除。load factor(加載因子)決定何時要對哈希表進行再哈希。在Java編程語言中,加載因子默認(rèn)值為0.75,默認(rèn)哈希表元為101。
總結(jié)
以上是生活随笔為你收集整理的java基础集合类之set的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java基础之集合类
- 下一篇: java基础之包装类