Collection Framework study tips[zz]
Posted on 2007-07-18 15:01 Matthew Chen 閱讀(183) 評(píng)論(0) 編輯 收藏 所屬分類: Java SE
HashSet 類和 TreeSet 類
“集合框架”支持 Set 接口兩種普通的實(shí)現(xiàn):HashSet 和 TreeSet。在更多情況下,您會(huì)使用 HashSet 存儲(chǔ)重復(fù)自由的集合??紤]到效率,添加到 HashSet 的對(duì)象需要采用恰當(dāng)分配散列碼的方式來(lái)實(shí)現(xiàn) hashCode() 方法。雖然大多數(shù)系統(tǒng)類覆蓋了 Object 中缺省的 hashCode() 實(shí)現(xiàn),但創(chuàng)建您自己的要添加到 HashSet 的類時(shí),別忘了覆蓋 hashCode()。當(dāng)您要從集合中以有序的方式抽取元素時(shí),TreeSet 實(shí)現(xiàn)會(huì)有用處。為了能順利進(jìn)行,添加到 TreeSet 的元素必須是可排序的。 “集合框架”添加對(duì) Comparable 元素的支持,在排序的“可比較的接口”部分中會(huì)詳細(xì)介紹。我們暫且假定一棵樹(shù)知道如何保持 java.lang 包裝程序器類元素的有序狀態(tài)。一般說(shuō)來(lái),先把元素添加到 HashSet,再把集合轉(zhuǎn)換為 TreeSet 來(lái)進(jìn)行有序遍歷會(huì)更快。
為優(yōu)化 HashSet 空間的使用,您可以調(diào)優(yōu)初始容量和負(fù)載因子。TreeSet 不包含調(diào)優(yōu)選項(xiàng),因?yàn)闃?shù)總是平衡的,保證了插入、刪除、查詢的性能為 log(n)。
HashSet 和 TreeSet 都實(shí)現(xiàn) Cloneable 接口。
HashSet中重復(fù)添加相同元素,HashSet中只有一個(gè)這樣的元素,并不重復(fù)。
TreeSet中元素按升序排列
HashMap 類和 TreeMap 類
“集合框架”提供兩種常規(guī)的 Map 實(shí)現(xiàn):HashMap 和 TreeMap。和所有的具體實(shí)現(xiàn)一樣,使用哪種實(shí)現(xiàn)取決于您的特定需要。在 Map 中插入、刪除和定位元素,HashMap 是最好的選擇。但如果您要按順序遍歷鍵,那么 TreeMap 會(huì)更好。根據(jù)集合大小,先把元素添加到 HashMap,再把這種映射轉(zhuǎn)換成一個(gè)用于有序鍵遍歷的 TreeMap 可能更快。使用 HashMap 要求添加的鍵類明確定義了 hashCode() 實(shí)現(xiàn)。有了 TreeMap 實(shí)現(xiàn),添加到映射的元素一定是可排序的。我們將在排序中詳細(xì)介紹。
為了優(yōu)化 HashMap 空間的使用,您可以調(diào)優(yōu)初始容量和負(fù)載因子。這個(gè) TreeMap 沒(méi)有調(diào)優(yōu)選項(xiàng),因?yàn)樵摌?shù)總處于平衡狀態(tài)。
HashMap 和 TreeMap 都實(shí)現(xiàn) Cloneable 接口。
HashMap中重復(fù)添加相同元素,HashMap中只有一個(gè)這樣的元素,并不重復(fù)。
Hashtable 類和 Properties 類是 Map 接口的歷史實(shí)現(xiàn)。
“集合框架”提供了個(gè)特殊的 Set 接口:SortedSet,它保持元素的有序順序。
該接口為集的子集和它的兩端(即頭和尾)提供了訪問(wèn)方法。當(dāng)您處理列表的子集時(shí),更改子集會(huì)反映到源集。此外,更改源集也會(huì)反映在子集上。發(fā)生這種情況的原因在于子集由兩端的元素而不是下標(biāo)元素指定。此外,如果 fromElement 是源集的一部分,它就是子集的一部分。但如果 toElement 是源集的一部分,它卻不是子集的一部分。如果您想要一個(gè)特殊的高端元素(to-element)在子集中,您必須找到下一個(gè)元素。對(duì)于一個(gè) String 來(lái)說(shuō),下一個(gè)元素是個(gè)附帶空字符的同一個(gè)字符串(string+"\0")。;
添加到 SortedSet 的元素必須實(shí)現(xiàn) Comparable,否則您必須給它的實(shí)現(xiàn)類的構(gòu)造函數(shù)提供一個(gè) Comparator:TreeSet(您可以自己實(shí)現(xiàn)接口。但是“集合框架”只提供這樣一個(gè)具體的實(shí)現(xiàn)類。)
“集合框架”提供了個(gè)特殊的Map 接口:SortedMap,它用來(lái)保持鍵的有序順序。
此接口為映射的子集包括兩個(gè)端點(diǎn)提供了訪問(wèn)方法。除了排序是作用于映射的鍵以外,處理 SortedMap 和處理 SortedSet 一樣。“集合框架”提供的實(shí)現(xiàn)類是 TreeMap。
因?yàn)閷?duì)于映射來(lái)說(shuō),每個(gè)鍵只能對(duì)應(yīng)一個(gè)值,如果在添加一個(gè)鍵-值對(duì)時(shí)比較兩個(gè)鍵產(chǎn)生了零返回值(通過(guò) Comparable 的 compareTo() 方法或通過(guò) Comparator 的 compare() 方法),那么,原始鍵對(duì)應(yīng)值被新的值替代。如果兩個(gè)元素相等,那還好。但如果不相等,那么您就應(yīng)該修改比較方法,讓比較方法和 equals() 的效果一致。