10 Java集合 - Set集合

10.1 Set集合

? ? ? ? Set接口繼承Collection接口巾陕,沒有提供額外的方法。Set集合不允許包含相同的元素睁蕾,向Set集合添加已存在的元素時秕狰,add()方法返回false。

10.2 HashSet類

? ? ? ? HashSet按Hash算法存儲集合中的元素东跪,具有良好的性能畸陡。Hash會調(diào)用該對象的hashCode()方法來得到該對象的hashCode值,然后根據(jù)hashCode值決定該對象在集合里的存儲位置虽填。即HashSet集合采用hash算法來決定元素的存儲位置丁恭。

????????HashSet中每個能存儲元素的位置被稱為“桶”。

? ??HashSet具有如下特點:

? ? ? ? - 元素的排列順序與添加順序不一定相同斋日。

? ? ? ? - 不是線程同步的牲览。

????????-?集合元素可以是null

? ??HashSet判斷兩個元素相等的標(biāo)準(zhǔn):

????????兩個對象通過equals()方法比較相等恶守,并且兩個對象的hashCode()方法返回值也相等第献。

? ? HashSet重寫equals和hashCode方法的規(guī)則:

? ? ? ? 如果兩個對象通過equals()方法比較返回true,這兩個對象的hashCode()值也應(yīng)該相同兔港。

? ??注意:如果HashSet存儲了可變類庸毫,對某一個元素的更改致使集合中出現(xiàn)兩個相同的元素,未被修改的元素可以被刪除押框,修改后的元素?zé)o法被刪除岔绸。因為HashSet根據(jù)hashCode值找到存儲位置,然后用equals判斷相等橡伞。

10.3 LinkedHashSet類

? ? ? ? LinkedHashSet類是HashSet類的子類盒揉,根據(jù)元素的hashCode值來決定元素的存儲位置,使用鏈表維護元素的添加次序兑徘。遍歷LinkedHashSet集合里的元素時刚盈,LinkedHashSet會按照元素的添加順序來訪問集合里的元素。

10.4 TreeSet類

? ? ? ? TreeSet類是SortedSet接口的實現(xiàn)類挂脑,TreeSet集合內(nèi)的元素處于有序狀態(tài)藕漱。TreeSet采用紅黑樹的數(shù)據(jù)結(jié)構(gòu)來存儲集合元素欲侮。TreeSet中應(yīng)添加同一種類型的對象。

????TreeSet集合新增如下方法:

? ? ? ? - Comparator comparator():如果TreeSet使用的定制排序肋联,此方法將返回使用的Comparator威蕉;若使用了自然排序,則返回null橄仍。

? ? ? ? - Object first():返回集合中的第一個元素韧涨。

? ? ? ? - Object last():返回集合中的最后一個元素。

? ? ? ? - Object lower(Object o):小于o的最大元素侮繁,o不需要存在集合中虑粥。

? ? ? ? - Object higher(Object o):大于o的最小元素,o不需要存在集合中宪哩。

? ? ? ? - SortedSet subSet(Object form, Object to):返回form(包括)到to(不包括)之間的元素作為子集合娩贷。

? ? ? ? - SortedSet headSet(Object to):返回小于to的元素作為子集合。

? ? ? ? - SortedSet tailSet(Object from):返回大于或等于from的元素作為子集合锁孟。

? ? 實現(xiàn)了Compable接口的常用類及比較方式:

? ? ? ? - BigDecimal和所有的數(shù)值型對應(yīng)的包裝類彬祖。

? ? ? ? - Character按UNICODE值進行比較。

? ? ? ? - Boolean按true大于false比較罗岖。

? ? ? ? - String按字符串中字符的UNICODE值進行比較涧至。

? ? ? ? - Date、Time類桑包,后面的日期時間比前面的大南蓬。

? ? 自然排序:

? ? ? ? TreeSet會調(diào)用集合元素的compareTo(Object o)方法來比較元素之間的大小關(guān)系,然后將集合元素按升序排序哑了,即為自然排序赘方。

????????如果試圖把一個對象添加到TreeSet時,該對象的類必須實現(xiàn)Comparable接口弱左。如果對象的類未實現(xiàn)Comparable接口窄陡,那么在加入元素和取出元素時,程序?qū)伋鯟lassCastException異常拆火。

? ? ? ? 注意:如果TreeSet集合存儲了可變類跳夭,對某一個元素的更改致使集合中出現(xiàn)兩個相同的元素,則未被修改的和修改以后的元素均不能被成功刪除们镜。只有刪除其他未被修改的元素币叹,并且TreeSet對元素重新索引之后,發(fā)生重復(fù)的元素才可以被刪除模狭。

? ? 定制排序:

? ? ? ? 創(chuàng)建TreeSet對象時傳入一個Comparator實現(xiàn)類的對象颈抚,并且重寫了int compare(T o1, T o2)方法。此時對象的類無須實現(xiàn)Comparable接口嚼鹉。

? ? TreeSet判斷兩個元素相等的標(biāo)準(zhǔn):

? ? ? ? 兩個對象通過compareTo(Object o)方法比較返回0贩汉。

? ??TreeSet重寫equals和compareTo方法的規(guī)則:

? ? ? ? 如果兩個對象通過equals方法比較返回true時驱富,這兩個對象通過compareTo方法比較應(yīng)返回0。

10.5 EnumSet類

????????EnumSet是專門為枚舉設(shè)計的集合類匹舞,EnumSet中的所有元素必須為指定枚舉類型的枚舉值褐鸥。EnumSet按枚舉值在枚舉類中的定義順序?qū)显剡M行排序。

? ? ? ? EnumSet內(nèi)部以位向量的形式進行存儲策菜。數(shù)據(jù)存儲緊湊且高效晶疼,占用內(nèi)存小酒贬,運行效率好又憨。

? ? ? ? Enum集合不允許加入null元素

? ? EnumSet類提供如下類方法來創(chuàng)建對象(未提供構(gòu)造器):

? ? ? ? - EnumSet allOf(Class enumType):創(chuàng)建一個包含指定枚舉類所有枚舉值的集合锭吨。

? ? ? ? - EnumSet complementOf(EnumSet s):創(chuàng)建一個EnumSet相對枚舉類為補集的集合蠢莺。

? ? ? ? - EnumSet copyOf(Collection c):根據(jù)只包含相同枚舉類枚舉值的普通集合來創(chuàng)建。

? ? ? ? - EnumSet copyOf(EnumSet s):根據(jù)EnumSet集合來創(chuàng)建零如,兩個集合有相同的枚舉值躏将。

? ? ? ? - EnumSet noneOf(Class enumType):創(chuàng)建一個類型為指定枚舉類的空集合。

? ? ? ? - EnumSet of(E first/E... rest):創(chuàng)建一個包含一個或多個枚舉值的集合考蕾。

? ? ? ? - EnumSet range(E from, E to):根據(jù)枚舉類中form到to之間的枚舉值創(chuàng)建集合祸憋,包含兩邊值。

10.6 各Set類的性能分析

????????HashSet的性能總是比TreeSet好肖卧,只有當(dāng)需要一個保持排序的Set是蚯窥,才考慮使用TreeSet。 LinkedHashSet在插入刪除時塞帐,性能比HashSet差拦赠,但遍歷元素時卻更快。EnumSet是所有集合中性能最好的葵姥,但是只能保存同一枚舉類中的枚舉值荷鼠。

? ? ? ? HashSet、TreeSet榔幸、EnumSet都是線程不安全的允乐。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市削咆,隨后出現(xiàn)的幾起案子牍疏,更是在濱河造成了極大的恐慌,老刑警劉巖态辛,帶你破解...
    沈念sama閱讀 216,591評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件麸澜,死亡現(xiàn)場離奇詭異,居然都是意外死亡奏黑,警方通過查閱死者的電腦和手機炊邦,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,448評論 3 392
  • 文/潘曉璐 我一進店門编矾,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人馁害,你說我怎么就攤上這事窄俏。” “怎么了碘菜?”我有些...
    開封第一講書人閱讀 162,823評論 0 353
  • 文/不壞的土叔 我叫張陵凹蜈,是天一觀的道長。 經(jīng)常有香客問我忍啸,道長仰坦,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,204評論 1 292
  • 正文 為了忘掉前任计雌,我火速辦了婚禮悄晃,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘凿滤。我一直安慰自己妈橄,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,228評論 6 388
  • 文/花漫 我一把揭開白布翁脆。 她就那樣靜靜地躺著眷蚓,像睡著了一般。 火紅的嫁衣襯著肌膚如雪反番。 梳的紋絲不亂的頭發(fā)上沙热,一...
    開封第一講書人閱讀 51,190評論 1 299
  • 那天,我揣著相機與錄音恬口,去河邊找鬼校读。 笑死,一個胖子當(dāng)著我的面吹牛祖能,可吹牛的內(nèi)容都是我干的歉秫。 我是一名探鬼主播,決...
    沈念sama閱讀 40,078評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼养铸,長吁一口氣:“原來是場噩夢啊……” “哼雁芙!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起钞螟,我...
    開封第一講書人閱讀 38,923評論 0 274
  • 序言:老撾萬榮一對情侶失蹤兔甘,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后鳞滨,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體洞焙,經(jīng)...
    沈念sama閱讀 45,334評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,550評論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了澡匪。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片熔任。...
    茶點故事閱讀 39,727評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖唁情,靈堂內(nèi)的尸體忽然破棺而出疑苔,到底是詐尸還是另有隱情,我是刑警寧澤甸鸟,帶...
    沈念sama閱讀 35,428評論 5 343
  • 正文 年R本政府宣布惦费,位于F島的核電站,受9級特大地震影響抢韭,放射性物質(zhì)發(fā)生泄漏薪贫。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,022評論 3 326
  • 文/蒙蒙 一篮绰、第九天 我趴在偏房一處隱蔽的房頂上張望后雷。 院中可真熱鬧,春花似錦吠各、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,672評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至藕筋,卻和暖如春纵散,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背隐圾。 一陣腳步聲響...
    開封第一講書人閱讀 32,826評論 1 269
  • 我被黑心中介騙來泰國打工伍掀, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人暇藏。 一個月前我還...
    沈念sama閱讀 47,734評論 2 368
  • 正文 我出身青樓蜜笤,卻偏偏與公主長得像,于是被迫代替她去往敵國和親盐碱。 傳聞我的和親對象是個殘疾皇子把兔,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,619評論 2 354