set集合


Set:元素是無序的(存入和取出的順序不一定一致)。元素不可以重復
|--HashSet:底層數據結構是Hash表
HashSet是如何保證元素唯一性的?
是通過元素的兩個方法,hashCode和equals來完成的
如果元素的hashCode值相同,才會判斷equals是否為true
如果hashCode的值不同,不會調用equals方法
注意:對於判斷元素是 否存在,以及刪除等操作。依賴的方法是元素的hashCode和equals方法。
|--TreeSet 可以對set集合中的元素進行排序
底層數據結構是二叉樹
保證元素唯一性的依據
compareTo方法return 0 ;
TreeSet排序的第一種方式:讓元素自身具備比較性,元素需要實現Comparable接口,覆蓋compareTo方法
這中方式也稱為元素的自然順序,或者叫做默認順序

set集合的功能和Collection是一致的。


Set集合的排序
我們知道,Set集合是無序的,
可以使用TreeSet類,那么TreeSet進行排序的規則是怎樣的呢?
1 TreeSet支持兩種排序方式,自然排序和定制排序,在默認情況下,TreeSet采用自然排序.
自然排序:
TreeSet會調用集合元素的compareTo(Object obj)方法來比較元素之間的大小關系,然后將集合的元素按升序排列,這種方式就是自然排序.
為什么集合元素有compareTo方法,因為集合元素對象實現了Comparable接口,該方法返回一個整數值,當一個對象調用該方法與另一個對象進行比較,例如:
obj1.compareTo(obj2)如果返回0,表示這兩個對象相等,如果該方法返回一個正整數,表示obj1大於obj2如果該方法返回一個負整數,表示obj1小於obj2
所以需要使用TreeSet集合進行自然排序,元素必須實現Comparable接口,但是Java一些常用的類已經實現了該接口,例如:String Character Boolean Date Time
BigDecimal BigInteger等
如:
TreeSet<String> ts = new TreeSet<String>();
ts.add("b");
ts.add("c");
ts.add("a");
System.out.println(ts);
結果:a b c


Set集合:(唯一)
1.特點:存入順序和取出順序不一致,不保證順序不變,且元素唯一,底層由HashMap實現
2.HashSet    
底層為哈希表----HashMap---唯一
   HashSet為什么唯一呢?
  依賴hashCode和equals方法來判斷兩個元素是否一樣,
  比如在判斷時:hashCode值不一樣---------->元素直接添加
 hashCode值一樣------>在判斷地址值和equals是否一樣(兩個有一個一樣就ok)--->也一樣---  ----->不添加
簡單來說:hashCode不一樣:直接添加
hashCode一樣,equals不一樣:直接添加
hashCode一樣,equals也一樣:不添加(此時說明是重復元素)
   說明:LinkedHashSet : HashSet的一個子類,可預知的迭代順序,存儲和取出順序一致,數據結構由哈希表和鏈表實現,保證唯一性和有序性。
 
3.TreeSet
底層為TreeMap(紅黑樹)----唯一且能夠根據某種排序規則進行排序,而比較是依賴於compareTo方法,方法在comparable接口內,需要排序的類要實現該接口。
排序:由構造方法來決定使用哪一種比較方法
(1)自然排序(元素具備):對象所屬類實現了自然排序接口comparable,重寫compareTo比較方法。
TreeSet()
(2)比較器排序(集合具備):
TreeSet(Comparator  comparator) , 構造里面傳一個Comparator比較器接口的實現類
 
而在comparator對象的類實現了Comparator接口,也實現了比較的方法compare,傳入兩個待比較對象,寫出比較邏輯,不過此處也可以不寫Comparator的實現類,直接用匿名內部類來實現,重寫比較方法compare即可。
 
     TreeSet存儲自定義對象並保證排序和唯一,因為排序依賴於comparable接口內的compareTo方法,並且在底層調用的時候,會把自定義類轉換為comparable類,(向上轉型,多態),如果自定義的類沒有實現該接口,則會報錯。comparableException。compareTo返回0表示相等,大於0表示大於被比較對象。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM