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都是線程不安全的允乐。