Set接口中的方法和Collection中方法一致的。Set接口取出方式只有一種,迭代器。
|--HashSet:底層數(shù)據(jù)結(jié)構(gòu)是哈希表,線程是不同步的。無(wú)序,高效;
HashSet集合保證元素唯一性:通過(guò)元素的hashCode方法,和equals方法完成的。
當(dāng)元素的hashCode值相同時(shí),才繼續(xù)判斷元素的equals是否為true。
如果為true,那么視為相同元素,不存。如果為false,那么存儲(chǔ)。
如果hashCode值不同,那么不判斷equals,從而提高對(duì)象比較的速度。
|--LinkedHashSet:有序,hashset的子類。
|--TreeSet:對(duì)Set集合中的元素的進(jìn)行指定順序的排序。不同步。TreeSet底層的數(shù)據(jù)結(jié)構(gòu)就是二叉樹。
哈希表的原理:
1,對(duì)對(duì)象元素中的關(guān)鍵字(對(duì)象中的特有數(shù)據(jù)),進(jìn)行哈希算法的運(yùn)算,并得出一個(gè)具體的算法值,這個(gè)值 稱為哈希值。
2,哈希值就是這個(gè)元素的位置。
3,如果哈希值出現(xiàn)沖突,再次判斷這個(gè)關(guān)鍵字對(duì)應(yīng)的對(duì)象是否相同。如果對(duì)象相同,就不存儲(chǔ),因?yàn)樵刂貜?fù)。如果對(duì)象不同,就存儲(chǔ),在原來(lái)對(duì)象的哈希值基礎(chǔ) +1順延。
4,存儲(chǔ)哈希值的結(jié)構(gòu),我們稱為哈希表。
5,既然哈希表是根據(jù)哈希值存儲(chǔ)的,為了提高效率,最好保證對(duì)象的關(guān)鍵字是唯一的。
這樣可以盡量少的判斷關(guān)鍵字對(duì)應(yīng)的對(duì)象是否相同,提高了哈希表的操作效率。
對(duì)于ArrayList集合,判斷元素是否存在,或者刪元素底層依據(jù)都是equals方法。
對(duì)于HashSet集合,判斷元素是否存在,或者刪除元素,底層依據(jù)的是hashCode方法和equals方法。
TreeSet:
用于對(duì)Set集合進(jìn)行元素的指定順序排序,排序需要依據(jù)元素自身具備的比較性。
如果元素不具備比較性,在運(yùn)行時(shí)會(huì)發(fā)生ClassCastException異常。
所以需要元素實(shí)現(xiàn)Comparable接口,強(qiáng)制讓元素具備比較性,復(fù)寫compareTo方法。
依據(jù)compareTo方法的返回值,確定元素在TreeSet數(shù)據(jù)結(jié)構(gòu)中的位置。
TreeSet方法保證元素唯一性的方式:就是參考比較方法的結(jié)果是否為0,如果return 0,視為兩個(gè)對(duì)象重復(fù),不存。
注意:在進(jìn)行比較時(shí),如果判斷元素不唯一,比如,同姓名,同年齡,才視為同一個(gè)人。
在判斷時(shí),需要分主要條件和次要條件,當(dāng)主要條件相同時(shí),再判斷次要條件,按照次要條件排序。
TreeSet集合排序有兩種方式,Comparable和Comparator區(qū)別:
1:讓元素自身具備比較性,需要元素對(duì)象實(shí)現(xiàn)Comparable接口,覆蓋compareTo方法。
2:讓集合自身具備比較性,需要定義一個(gè)實(shí)現(xiàn)了Comparator接口的比較器,并覆蓋compare方法,并將該類對(duì)象作為實(shí)際參數(shù)傳遞給TreeSet集合的構(gòu)造函數(shù)。
第二種方式較為靈活。
本文版權(quán)歸傳智播客Java培訓(xùn)學(xué)院所有,歡迎轉(zhuǎn)載,轉(zhuǎn)載請(qǐng)注明作者出處。謝謝!
作者:傳智播客Java培訓(xùn)學(xué)院
首發(fā):http://xamj520.com/javaee