set集合儲存的元素是沒有順序、且不能重複的。它有三個實現類:hashset、treeset、enumset
1、hashset
hashset按照hash演算法來儲存集合中的元素,因此具有良好的訪問和查詢效能
特點:
儲存的特性:
hashset判斷兩元素相等的標準:
兩個物件通過equals()方法比較相等,並且兩個物件的hashcode()方法返回值也相同
tips:
1、如果把乙個物件放入hashset中時,如果需要重寫該物件對應類的equals()方法時,則也應該重寫其hash code()方法。
具體規則:當兩個物件通過equals()方法比較返回true,則這兩個物件的hashcode值也應該相同。
2、如果兩個物件通過equals()方法比較返回true,但hashcode()方法false,則hashset會把這兩個物件儲存在不同的位置,這兩個物件都可以新增成功。
3、如果兩個物件通過equals()方法比較返回false,但hashcode()方法true,則hashset會把這兩個物件儲存在同乙個位置,在這個位置通過鏈式結構來儲存多個物件。
因為hashset訪問集合元素時也是根據元素的hashcode值來快速定位,因此當hashset中有兩個以上的元素具有相同的hashcode值,將會導致效能的下降。
4、當從hashset中訪問元素時,hashset先計算該元素的hashcode值(即呼叫該物件的hashcode()方法的返回值),然後直接到該hashcode值對應的位置去取出該元素,這就是hashset速度很快的原因。
2、linkedhashset
定義:1、linkedhashset也是根據元素的hashcode值來決定元素儲存位置
2、但它同時使用鍊錶維護元素的次序,從而可以保證元素是按照插入順序進行儲存的。
即:當遍歷linkedhashset時,linkedhashset會按照元素的新增順序來訪問集合裡的元素。
3、也是乙個set,因此也不允許元素重複
效能:因為linkedhashset需要維護元素的插入順序,因此效能略低於hashset,但在迭代訪問set裡的全部元素時將有很好的效能,因為它是以鍊錶來維護內部順序的。
3、treeset類
treeset是sortset介面的實現類,treeset可以保證集合元素處於排序狀態。
treeset相比於hashset多了如下幾個額外的方法:
treeset類集合元素排序方式:
一般而言treeset是根據元素實際值的大小來進行排序的,treeset採用紅黑樹的資料結構來儲存集合元素。treeset支援兩種排序方法:自然排序
和定製排序
1、自然排序
① 原理:
treeset會呼叫集合元素的compareto(object obj)方法來比較元素之間的大小,然後將集合元素按照公升序進行排列。
② 要求:
1、因為compareto(object obj)
方法是comparable
介面中定義的方法,所以如果要把乙個物件新增到treeset時,則該物件的類必須實現comparable
介面,否則treeset無法進行比較,從而會丟擲異常classcastexception
2、因為只有相同類的例項才會比較大小,這就要求向treeset中新增的應該是同乙個類的物件
③判斷元素是否相等:
treeset判斷兩個元素是否相等的唯一標準是:兩個物件通compareto(object obj)
方法比較是否返回0,如果返回0,則treeset會認為它們相等,否則就認為它們不相等。
④ 注意點
1、當把乙個物件放入treeset中時,如果重寫了該物件的 equals() 方法時,也應該保證該方法和 compareto(object obj)方法有一致的返回結果。規則 equals() 返回true時,compareto(object obj) 返回0.
2、 如果向treeset中新增乙個可變物件後,並且程式修改了該可變物件的例項變數,這將導致與其他物件的大小順序發生了改變,但treeset不會再重新調整它們的順序。甚至有可能導致treeset中兩個物件通過compareto(object obj)比較後返回0。
如果一旦改變了treeset集合裡可變元素的例項變數,當試圖再刪除該物件時,treeset也會從刪除失敗(甚至集合中原有的、例項變數沒有被修改但與修改後元素相等的元素也無法刪除)
2、定製排序
① 原理:
1、通過comparator介面來實現,該介面中包含乙個compare(t o1,t o2
)方法,該方法用於比較o1和o2的大小。
2、實現定製排序,需要在建立treeset集合物件時,提供乙個comparator物件與該treeset集合關聯,由comparator物件負責集合元素的邏輯排序。
**示例:
/*自定義類m*/
class m
public string tostring()
}/*自定義的排序規則*/
public
class
comparatorm
implements
comparator
}public
class
treesettest4
}
②定製排序判斷元素是否相等:通過comparator比較兩個元素是否返回0,如果返回了0,則treeset是不會把第二個元素新增到集合當中。
4、enumset類
定義:
1、enumset是專門為列舉型別設計的集合類,其中所有的元素都必須是制定列舉型別的列舉值,該列舉型別在建立enumset時顯式或隱式地指定。
**示例:
/*列舉型別*/
enum season
/*測試函式*/
public
class enumsettest
}
2、enumset集合元素也是有順序的,enumset以列舉值在enum類內的定義順序來決定集合元素的順序
3、enumset在內部以位向量的形式儲存,該儲存形式非常緊湊、高效,因此enumset物件占用記憶體小,且執行效率很好,尤其是進行批量操作(如:containsall()和retainall()方法時)
4、enumset不允許加入null元素,如果試圖插入,會報空指標異常
5、當複製collection集合中所有的元素來建立新的enumset集合時,要求collection集合中所有的元素必須是同乙個列舉型別的列舉值。
5、各set實現類的效能分析
1、hashset的效能總是好於treeset(特別是常用的新增、查詢等操作),因為treeset需要額外的紅黑樹演算法來維持集合元素的順序,因此當需要乙個保持排序的set時,才應該使用treeset,否則使用hashset
2、對於普通的插入、刪除操作,linkedhashset要比hashset慢一點,因為是由維護鍊錶所造成的,但遍歷時linkedhashset會快。
3、enumset是實現類中效能最好的,但它因為只能儲存乙個列舉型別當中的列舉值作為集合元素,所以有侷限性
4、set的三個實現類都是執行緒不安全的,為了保證執行緒安全,必須手動保證該set集合的同步性,通常是通過collections工具類的synchronizedsortedset方法來「包裝」該set集合,此操作最好在建立時進行,以防止對set集合的意外非同步操作,如:
sortedset s =collections.synchronizedsortedset(new treeset<>());
Java集合 Set集合總結
特點 無序 不允許重複的 實現類 hashset 通過hash碼資料結構進行儲存的 無序 不重複 如果想要判斷兩個物件是否是同乙個物件 通常情況比較位址,但是現在需要通過制定內容來判斷是否相同 hashcode 判斷的其各個屬性的hashcode 而非物件真正的位址 結論 如果hashcode相同 ...
JAVA集合學習 Set
可以分為3種集合set list,map,其中常用的有hashset,arraylist,hashmap 1,collection是set,list,queue3個介面的父介面主要方法如下 collection a new arraylist collection b new arraylist 新...
Java集合 Set架構
set的實現類是基於map來實現的 hashset是通過hashmap實現的,treeset是通過treemap實現的 首先,我們看看set架構。01 set 是繼承於collection的介面。它是乙個不允許有重複元素的集合。02 abstractset 是乙個抽象類,它繼承於abstractco...