日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

java基础集合类之set

發布時間:2025/3/20 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java基础集合类之set 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Set也是Collection的一種擴展,而與List不同的時,在Set中的對象元素不能重復。Set的常用具體實現有HashSet和TreeSet類。

一、HashSet和TreeSet類的區別

HashSet能快速定位一個元素,但是你放到HashSet中的對象需要實現hashCode()方法,它使用了哈希碼的算法。而TreeSet則將放入其中的元素按序存放,這就要求你放入其中的對象是可排序的,這就用到了集合框架提供的另外兩個實用類Comparable和Comparator。一個類是可排序的,它就應該實現Comparable接口。有時多個類具有相同的排序算法,那就不需要在每分別重復定義相同的排序算法,只要實現Comparator接口即可。集合框架中還有兩個很實用的公用類:Collections和Arrays。Collections提供了對一個Collection容器進行諸如排序、復制、查找和填充等一些非常有用 的方法,Arrays則是對一個數組進行類似的操作。

二、Comparable接口和Comparator接口

在“集合框架”中有兩種比較接口:Comparable接口和Comparator接口。像String和Integer等Java內建類實現Comparable接口以提供一定排序方式,但這樣只能實現該接口一次。對于那些沒有實現Comparable接口的類、或者自定義的類,你可以通過Comparator接口來定義您自己的比較方式。

1.Comparable接口:

int compareTo(Object o): 比較當前實例對象與對象o,如果位于對象o之前,返回負值,如果兩個對象在排序中位置相同,則返回0,如果位于對象o后面,則返回正值。
JDK中實現了Comparable接口的類的排序方式

(1)按數字大小排序:BigDecimal,BigInteger,Byte, Double, Float,Integer,Long,Short

(2)按 Unicode 值的數字大小排序:Character

(3)按字符串中字符 Unicode 值排序:String
利用Comparable接口創建您自己的類的排序順序,需要實現compareTo()方法。通常就是依賴幾個數據成員的自然排序。同時類也應該覆蓋equals()和hashCode()以確保兩個相等的對象返回同一個哈希碼。

2.Comparator接口:

若一個類不能用于實現java.lang.Comparable,或者不需要缺省的Comparable行為并想提供自己的排序順序(可能多種排序方式),你可以實現Comparator接口,從而定義一個比較器。

(1)int compare(Object o1, Object o2): 對兩個對象o1和o2進行比較,如果o1位于o2的前面,則返回負值,如果在排序順序中認為o1和o2是相同的,返回0,如果o1位于o2的后面,則返回正值
注釋:與Comparable相似,0返回值不表示元素相等。一個0返回值只是表示兩個對象排在同一位置。由Comparator用戶決定如何處理。如果兩個不相等的元素比較的結果為零,您首先應該確信那就是您要的結果,然后記錄行為。

(2)boolean equals(Object obj): 指示對象obj是否和比較器相等。
注釋:該方法覆寫Object的equals()方法,檢查的是Comparator實現的等同性,不是處于比較狀態下的對象。

三、SortedSet接口

1.集合框架提供了個特殊的Set接口:SortedSet,它保持元素的有序順序。SortedSet接口為集的視圖(子集)和它的兩端(即頭和尾) 提供了訪問方法。當您處理列表的子集時,更改視圖會反映到源集。此外,更改源集也會反映在子集上。發生這種情況的原因在于視圖由兩端的元素而不是下標元素 指定,所以如果您想要一個特殊的高端元素(toElement)在子集中,您必須找到下一個元素。
添加到SortedSet實現類的元素必須實現Comparable接口,否則您必須給它的構造函數提供一個Comparator接口的實現。TreeSet類是它的唯一一份實現。

2.因為集必須包含唯一的項,如果添加元素時比較兩個元素導致了0返回值(通過Comparable的compareTo()方法或Comparator 的compare()方法),那么新元素就沒有添加進去。如果兩個元素相等,那還好。但如果它們不相等的話,您接下來就應該修改比較方法,讓比較方法和 equals() 的效果一致。

3.常用函數:

(1) Comparator comparator(): 返回對元素進行排序時使用的比較器,如果使用Comparable接口的compareTo()方法對元素進行比較,則返回null

(2) Object first(): 返回有序集合中第一個(最低)元素

(3) Object last(): 返回有序集合中最后一個(最高)元素

(4)SortedSet subSet(Object fromElement, Object toElement): 返回從fromElement(包括)至toElement(不包括)范圍內元素的SortedSet視圖(子集)

(5) SortedSet headSet(Object toElement): 返回SortedSet的一個視圖,其內各元素皆小于toElement

(6) SortedSet tailSet(Object fromElement): 返回SortedSet的一個視圖,其內各元素皆大于或等于fromElement

四、AbstractSet抽象類

AbstractSet類覆蓋了Object類的equals()和hashCode()方法,以確保兩個相等的集返回相同的哈希碼。若兩個集大小相等 且包含相同元素,則這兩個集相等。按定義,集的哈希碼是集中元素哈希碼的總和。因此,不論集的內部順序如何,兩個相等的集會有相同的哈希碼。

五、Set有關類的常用函數

1.HashSet的常用函數:

(1)HashSet(): 構建一個空的哈希集

(2)HashSet(Collection c): 構建一個哈希集,并且添加集合c中所有元素

(3)HashSet(int initialCapacity): 構建一個擁有特定容量的空哈希集

(4)HashSet(int initialCapacity, float loadFactor): 構建一個擁有特定容量和加載因子的空哈希集。LoadFactor是0.0至1.0之間的一個數

2.TreeSet的常用函數:

(1)TreeSet():構建一個空的樹集

(2)TreeSet(Collection c): 構建一個樹集,并且添加集合c中所有元素

(3)TreeSet(Comparator c): 構建一個樹集,并且使用特定的比較器對其元素進行排序

(4)TreeSet(SortedSet s): 構建一個樹集,添加有序集合s中所有元素,并且使用與有序集合s相同的比較器排序

3.LinkedHashSet的常用函數

(1) LinkedHashSet(): 構建一個空的鏈接式哈希集

(2) LinkedHashSet(Collection c): 構建一個鏈接式哈希集,并且添加集合c中所有元素

(3) LinkedHashSet(int initialCapacity): 構建一個擁有特定容量的空鏈接式哈希集

(4) LinkedHashSet(int initialCapacity, float loadFactor): 構建一個擁有特定容量和加載因子的空鏈接式哈希集。LoadFactor是0.0至1.0之間的一個數

六、Hash表簡介

1.Hash表是一種數據結構,用來查找對象。Hash表為每個對象計算出一個整數,稱為Hash Code(哈希碼)。Hash表是個鏈接式列表的陣列。每個列表稱為一個buckets(哈希表元)。對象位置的計算index = HashCode % buckets (HashCode為對象哈希碼,buckets為哈希表元總數)。

2.當你添加元素時,有時你會遇到已經填充了元素的哈希表元,這種情況稱為Hash Collisions(哈希沖突)。這時,你必須判斷該元素是否已經存在于該哈希表中。

3.如果哈希碼是合理地隨機分布的,并且哈希表元的數量足夠大,那么哈希沖突的數量就會減少。同時,你也可以通過設定一個初始的哈希表元數量來更好地控制哈 希表的運行。初始哈希表元的數量為buckets = size * 150% + 1 (size為預期元素的數量)。

如果哈希 表中的元素放得太滿,就必須進行rehashing(再哈希)。再哈希使哈希表元數增倍,并將原有的對象重新導入新的哈希表元中,而原始的哈希表元被刪 除。load factor(加載因子)決定何時要對哈希表進行再哈希。在Java編程語言中,加載因子默認值為0.75,默認哈希表元為101。

總結

以上是生活随笔為你收集整理的java基础集合类之set的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。