今天大概的整理了一下java集合框架,在這裏作一個小結,方便之後查閱,本博文主要參考資料爲《java編程思想第四版》第11章——持有對象以及JAVA 1.6 API文檔。並無研究更深刻的第17章<容器深刻研究>。大概介紹了集合框架中幾個比較經常使用的集合類。java
如下爲正文。編程
首先來看一張圖,不太會用visio,畫的可能不太好看數組
圖中將接口、抽象類、實現類、淘汰類(圓角矩形)進行標註。有直線鏈接的類(或接口)表示是子類關係或者實現關係安全
由圖示能夠看出,集合類主要有兩個集合接口:數據結構
1.Collection: 獨立元素的序列。併發
2.Map: 成對出現的「鍵值對」對象序列。框架
Collection集合:性能
1.1 List(數組的升級版)spa
List集合便是數據結構中所講的線性表。此接口的能夠對列表中每一個元素的插入位置進行精確地控制。用戶能夠根據元素的整數索引訪問元素,並搜索列表中的元素。列表一般容許重複的元素。線程
List有一個抽象類:AbstractList,該子接口又有兩個子類:ArrayList,Vector(已廢棄)
ArrayList即順序表,其內部數據結構就是一個數組。相對於數組而言,最大的優勢即支持擴容。相對於LinkedList的優勢在於支持隨機檢索。缺點在於插入,刪除節點效率低下。
LinkedList即鏈表,可是其內部實現是雙向鏈表,而非單鏈表。相對於順序表而言的有點在於,插入、刪除節點效率高,雖然支持索引訪問,可是其本質是遍歷鏈表,所以訪問效率低下。
Vector與ArrayList的區別:
1.同步性:Vector是線程安全的,也就是說是同步的,而ArrayList是線程序不安全的,不是同步的
2.數據增加:當須要增加時,Vector默認增加爲原來一培,而ArrayList倒是原來的一半 。
1.2 Set(主要用於檢測歸屬性)
Set是真正數學意義上的集合。其特色即肯定性、互異性、無序性。
Set接口有一個子接口SortedSet及一個抽象子類AbstractSet。
最經常使用的實現類有三個:HashSet、LinkedHashSet(HashSet的子類)以及TreeSet
HashSet-基於散列表的集,加進散列表的元素要實現hashCode()方法,訪問速度很是快。
LinkedHashSet-一樣是根據元素的hashCode值來決定元素的存儲位置,可是它同時使用鏈表維護元素的次序。這樣使得元素看起 來像是以插入順序保存的,也就是說,當遍歷該集合時候,LinkedHashSet將會以元素的添加順序訪問集合的元素。
TreeSet-基於(平衡)樹的數據結構。TreeSet是SortedSet接口的惟一實現類,TreeSet能夠確保集合元素處於排序狀態。TreeSet支持兩種排序方式,天然排序 和定製排序,其中天然排序爲默認的排序方式。
1.3 Queue(併發編程中很重要)
Queue即數據結構中所提到的「隊列」,其實隊列的功能徹底能夠由線性表實現。事實上,「隊列」和「棧」也的確是有插入刪除規範的線性表。java也很體貼的讓LinkedList實現了Queue接口。(ArrayList並不合適)
如圖中所示
Queue接口有一子接口:Deque和一抽象類AbstractQueue,並有三個經常使用實現類PriorityQueue,LinkedList,ArrayDeque
LinkedList自沒必要說。
PriorityQueue(常稱爲優先級隊列)是不一樣於FIFO隊列的另外一種隊列。其是個基於優先級堆的極大優先級隊列。此隊列按照在構造時所指定的順序對元素排序,既能夠根據元素的天然順序來指定排序(參閱 Comparable),
1: 該隊列是用數組實現(堆),可是數組大小能夠動態增長,容量無限。2: 此實現不是同步的。不是線程安全的。若是多個線程中的任意線程從結構上修改了列表, 則這些線程不該同時訪問 PriorityQueue 實例,這時請使用線程安全的PriorityBlockingQueue 類。
3: 不容許使用 null 元素。
4: 此實現爲插入方法(offer、poll、remove() 和 add 方法)提供 O(log(n)) 時間(堆的調整); 爲 remove(Object) 和 contains(Object) 方法提供線性時間; 爲檢索方法(peek、element 和 size)提供固定時間。
2. Map
Map接口不是Collection接口的繼承。
Map接口用於維護鍵/值對。該接口描述了從不重複的鍵到值的映射。Map 接口提供三種collection 視圖,容許以鍵集、值集合或鍵-值映射關係集的形式查看某個映射的內容:
Set keySet(): 返回映像中全部關鍵字的視圖集
Collection values():返回映像中全部值的視圖集
Set entrySet(): 返回Map.Entry對象的視圖集,即映像中的關鍵字/值對
Map接口有一個子接口SortedMap,該接口有兩個實現類:TreeMap(ConcurrentSkipListMap不經常使用,不做討論)
因爲TreeMap它底層採用一棵「紅黑樹」來保存集合中的 Entry,這意味這 TreeMap 添加元素、取出元素的性能都比HashMap 低O(lgN):當 TreeMap 添加元素時,須要經過循環找到新增 Entry 的插入位置,所以比較耗性能;當從TreeMap 中取出元素時,須要經過循環才能找到合適的 Entry,也比較耗性能。但 TreeMap、TreeSet 比HashMap、HashSet 的優點在於:TreeMap 中的全部 Entry 老是按 key 根據指定排序規則保持有序狀態,TreeSet 中全部元素老是根據指定排序規則保持有序狀態,對排序二叉樹,若按中序遍歷就能夠獲得由小到大的有序序列。
Map接口有一個抽象類,並有三個經常使用的實現子類:HashMap,LinkedHashMap(HashMap的子類)、以及TreeMap
HashMap,其中最最經常使用的即HashMap。在Map 中插入、刪除和查找元素,HashMap 是最好的選擇。但若是您要按天然順序或自定義順序遍歷鍵,那麼TreeMap會更好。使用HashMap要求添加的鍵類明肯定義了hashCode()和equals()的實現。
LinkedHashMap:擴展HashMap,以插入順序將關鍵字/值對添加進連接哈希映像中。象LinkedHashSet同樣,LinkedHashMap內部也採用雙重連接式列表。因此迭代順序也就是插入順序。
Collection 和 Collections的區別。
Collections是個java.util下的類,它包含有各類有關集合操做的靜態方法。
Collection是個java.util下的接口,它是各類集合結構的父接口
ArrayList和Vector的區別。
一.同步性:Vector是線程安全的,也就是說是同步的,而ArrayList是線程序不安全的,不是同步的
二.數據增加:當須要增加時,Vector默認增加爲原來一培,而ArrayList倒是原來的一半
HashMap和Hashtable的區別
一.歷史緣由:Hashtable是基於陳舊的Dictionary類的,HashMap是Java 1.2引進的Map接口的一個實現二.同步性:Hashtable是線程安全的,也就是說是同步的,而HashMap是線程序不安全的,不是同步的
三.值:只有HashMap可讓你將空值做爲一個表的條目的key或value