Java集合總結(二) Set集合

2021-08-20 10:50:10 字數 4158 閱讀 4235

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...