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