java集合類主要由兩個接口派生而出:Collection和Map,請注意,Map沒有繼承Collection接口.
Set集合。
Set集合里面的多個對象沒有明顯順序。Set不允許有重復元素。當試圖把兩個相同的對象()加入一個Set中時,對象會調用equals方法比較兩個對象元素是否相同,相同則不會加入。
1.1HashSet。HashSet是Set的典型實現。HashSet按照Hash算法存儲元素,具有良好的存取和查找性能。特點:
①不能保證元素的排列順序;
②HashSet不是同步的,非線程安全的,假設有兩個或兩個以上的線程同時修改HashSet時,必須通過代碼來實現同步;
③允許元素值為null。
HashSet集合判斷兩個元素是否相等的標准是兩個對象(元素)通過equals方法比較返回true,並且兩個對象的HashCode()方法返回值也要相等。因為HashCode集合中存入一個元素時,HashSet會調用該對象的的HashCode方法得到對象的HashCode值,決定該對象在HashCode中的存儲位置。如果加入的兩個對象通過equals()的返回值相等,但是HashCode()的返回值不相等,HashSet依然會認為兩個元素是不相等的,可以添加成功。所以,當把某個類的對象作為元素存儲到HashSet中,重寫這個類的equals方法和HashCode方法時,盡量保證兩個對象通過equals()方法返回true時,他們的HashCode()方法的返回值也是相等的。
1.2LinkedHashSet。LinkedHashSet是HashSet的一個子類。使用鏈表來維護元素的次序。也就是說當遍歷LinkedHashSet集合時,將會以元素添加時的順序來訪問集合中的數據。LinkedHashSet需要維護元素的插入順序,因此性能低於HashSet,但是在迭代訪問Set全部元素時有較好的性能,因為以鏈表維護內部的順序。是非同步的,非線程安全。依然不允許元素重復。
1.3TreeSet。TreeSet是SortedSet接口的實現類。如其名字,TreeSet可以確保內部元素有序,采用紅黑樹的結構來存儲集合元素,TreeSet支持兩種排序方法:自然排序和定制排序。
①自然排序:TreeSet調用集合元素的compareTo(Object obj)方法來比較元素之間的大小,然后按照元素升序排列。這就要求對象元素必須實現Comparable接口中的compareTo(Object obj)方法。在自然排序下,TreeSet判斷兩個對象是否相同的唯一標准:兩個對象通過compareTo(Object o)方法比較是否相等:該方法返回0,則認為相等,返回1則認為不相等。java的一些常見的類,例如Character,String,Date等已經實現了Comparable接口。
②定制排序:在創建TreeSet集合對象時,需要關聯一個Comparator對象,並且實現Comparator中的compare(T obj1,T obj 2)。當通過Comparator對象實現TreeSet的定制排序時,也不可以向TreeSet中添加不同類型的對象。使用定制排序時,TreeSet利用Comparator負責排序規則,在定制排序下,TreeSet判斷兩個對象是否相同的標准是:通過Comparator比較兩個元素時返回0。
1.4EnumTree。EnumTree是專門為枚舉類設計的集合。EnumTree中所有的元素必須要求是指定枚舉類型的枚舉值。該枚舉類型在創建EnumTree時顯式或隱式的指定。EnumTree也是有序的,EnumTree在內部以位向量的行駛存儲,緊湊,高效,占用內存小,EnumTree同樣不允許插入null。
幾種Set實現類的總結:
①HashSet的性能比TreeSet的性能高(查詢、添加等),因為TreeSet需要紅黑樹算法來維護內部元素的順序。只有要實現保持排序狀態的Set時,才用到TreeSet,否則應該使用HashSet;
②LinkedHashSet對於插入和刪除操作性能比HashSet要差,因為LinkedHashSet是利用鏈表來維護添加順序的,但是正因如此,遍歷操作要比HashSet要快;
③EnumSet是所有Set實現類中性能最好的,但是其應用范圍較小:只能保存同一個枚舉類的枚舉值作為集合元素;④在HashSet和TreeSet中盡量只添加不可變對象;⑤上述三個Set的實現類都是線程不安全的。如果多個線程同時訪問修改一個Set集合,必須手動實現線程同步性。例如通過Collections工具類的synchronizeSorted方法包裝Set集合。SortedSet<String> s = Collection.synchronizeSorted(new HashSet<String>());