java集合框架小結(初級版)

今天大概的整理了一下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),

也能夠根據 Comparator 來指定,這取決於使用哪一種構造方法。優先級隊列不容許 null 元素。依靠天然排序的優先級隊列還不容許插入不可比較的對象(這樣作可能致使 ClassCastException)
優先隊列有幾點須要注意的地方:
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 OlgN:當 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 

相關文章
相關標籤/搜索