在編寫java程序中,咱們最經常使用的除了八種基本數據類型,String對象外還有一個集合類,在咱們的的程序中處處充斥着集合類的身影!java中集合你們族的成員實在是太豐富了,有經常使用的ArrayList、HashMap、HashSet,也有不經常使用的Stack、Queue,有線程安全的Vector、HashTable,也有線程不安全的LinkedList、TreeMap等等!java
上面的圖展現了整個集合你們族的成員以及他們之間的關係。下面就上面的各個接口、基類作一些簡單的介紹(主要介紹各個集合的特色。區別),更加詳細的介紹會在不久的未來一一講解。數組
Collection接口是最基本的集合接口,它不提供直接的實現,Java SDK提供的類都是繼承自Collection的「子接口」如List和Set。Collection所表明的是一種規則,它所包含的元素都必須遵循一條或者多條規則。若有些容許重複而有些則不能重複、有些必需要按照順序插入而有些則是散列,有些支持排序可是有些則不支持。安全
在Java中全部實現了Collection接口的類都必須提供兩套標準的構造函數,一個是無參,用於建立一個空的Collection,一個是帶有Collection參數的有參構造函數,用於建立一個新的Collection,這個新的Collection與傳入進來的Collection具有相同的元素。數據結構
List接口爲Collection直接接口。List所表明的是有序的Collection,即它用某種特定的插入順序來維護元素順序。用戶能夠對列表中每一個元素的插入位置進行精確地控制,同時能夠根據元素的整數索引(在列表中的位置)訪問元素,並搜索列表中的元素。實現List接口的集合主要有:ArrayList、LinkedList、Vector、Stack。框架
ArrayList是一個動態數組,也是咱們最經常使用的集合。它容許任何符合規則的元素插入甚至包括null。每個ArrayList都有一個初始容量(10),該容量表明瞭數組的大小。隨着容器中的元素不斷增長,容器的大小也會隨着增長。在每次向容器中增長元素的同時都會進行容量檢查,當快溢出時,就會進行擴容操做。因此若是咱們明確所插入元素的多少,最好指定一個初始容量值,避免過多的進行擴容操做而浪費時間、效率。異步
size、isEmpty、get、set、iterator 和 listIterator 操做都以固定時間運行。add 操做以分攤的固定時間運行,也就是說,添加 n 個元素須要 O(n) 時間(因爲要考慮到擴容,因此這不僅是添加元素會帶來分攤固定時間開銷那樣簡單)。函數
ArrayList擅長於隨機訪問。同時ArrayList是非同步的。性能
一樣實現List接口的LinkedList與ArrayList不一樣,ArrayList是一個動態數組,而LinkedList是一個雙向鏈表。因此它除了有ArrayList的基本操做方法外還額外提供了get,remove,insert方法在LinkedList的首部或尾部。測試
因爲實現的方式不一樣,LinkedList不能隨機訪問,它全部的操做都是要按照雙重鏈表的須要執行。在列表中索引的操做將從開頭或結尾遍歷列表(從靠近指定索引的一端)。這樣作的好處就是能夠經過較低的代價在List中進行插入和刪除操做。spa
與ArrayList同樣,LinkedList也是非同步的。若是多個線程同時訪問一個List,則必須本身實現訪問同步。一種解決方法是在建立List時構造一個同步的List:
List list = Collections.synchronizedList(new LinkedList(...));
與ArrayList類似,可是Vector是同步的。因此說Vector是線程安全的動態數組。它的操做與ArrayList幾乎同樣。
Stack繼承自Vector,實現一個後進先出的堆棧。Stack提供5個額外的方法使得Vector得以被看成堆棧使用。基本的push和pop 方法,還有peek方法獲得棧頂的元素,empty方法測試堆棧是否爲空,search方法檢測一個元素在堆棧中的位置。Stack剛建立後是空棧。
Set是一種不包括重複元素的Collection。它維持它本身的內部排序,因此隨機訪問沒有任何意義。與List同樣,它一樣運行null的存在可是僅有一個。因爲Set接口的特殊性,全部傳入Set集合中的元素都必須不一樣,同時要注意任何可變對象,若是在對集合中元素進行操做時,致使e1.equals(e2)==true,則一定會產生某些問題。實現了Set接口的集合有:EnumSet、HashSet、TreeSet。
是枚舉的專用Set。全部的元素都是枚舉類型。
HashSet堪稱查詢速度最快的集合,由於其內部是以HashCode來實現的。它內部元素的順序是由哈希碼來決定的,因此它不保證set 的迭代順序;特別是它不保證該順序恆久不變。
基於TreeMap,生成一個老是處於排序狀態的set,內部以TreeMap來實現。它是使用元素的天然順序對元素進行排序,或者根據建立Set 時提供的 Comparator
進行排序,具體取決於使用的構造方法。
Map與List、Set接口不一樣,它是由一系列鍵值對組成的集合,提供了key到Value的映射。同時它也沒有繼承Collection。在Map中它保證了key與value之間的一一對應關係。也就是說一個key對應一個value,因此它不能存在相同的key值,固然value值能夠相同。實現map的有:HashMap、TreeMap、HashTable、Properties、EnumMap。
以哈希表數據結構實現,查找對象時經過哈希函數計算其位置,它是爲快速查詢而設計的,其內部定義了一個hash表數組(Entry[] table),元素會經過哈希轉換函數將元素的哈希地址轉換成數組中存放的索引,若是有衝突,則使用散列鏈表的形式將全部相同哈希地址的元素串起來,可能經過查看HashMap.Entry的源碼它是一個單鏈表結構。
鍵以某種排序規則排序,內部以red-black(紅-黑)樹數據結構實現,實現了SortedMap接口
也是以哈希表數據結構實現的,解決衝突時與HashMap也同樣也是採用了散列鏈表的形式,不過性能比HashMap要低
隊列,它主要分爲兩大類,一類是阻塞式隊列,隊列滿了之後再插入元素則會拋出異常,主要包括ArrayBlockQueue、PriorityBlockingQueue、LinkedBlockingQueue。另外一種隊列則是雙端隊列,支持在頭、尾兩端插入和移除元素,主要包括:ArrayDeque、LinkedBlockingDeque、LinkedList。
出處:http://blog.csdn.net/softwave/article/details/4166598
1,vector是線程同步的,因此它也是線程安全的,而arraylist是線程異步的,是不安全的。若是不考慮到線程的安全因素,通常用arraylist效率比較高。
2,若是集合中的元素的數目大於目前集合數組的長度時,vector增加率爲目前數組長度的100%,而arraylist增加率爲目前數組長度的50%.如過在集合中使用數據量比較大的數據,用vector有必定的優點。
3,若是查找一個指定位置的數據,vector和arraylist使用的時間是相同的,都是0(1),這個時候使用vector和arraylist均可以。而若是移動一個指定位置的數據花費的時間爲0(n-i)n爲總長度,這個時候就應該考慮到使用linklist,由於它移動一個指定位置的數據所花費的時間爲0(1),而查詢一個指定位置的數據時花費的時間爲0(i)。
ArrayList 和Vector是採用數組方式存儲數據,此數組元素數大於實際存儲的數據以便增長和插入元素,都容許直接序號索引元素,可是插入數據要設計到數組元素移動等內存操做,因此索引數據快插入數據慢,Vector因爲使用了synchronized方法(線程安全)因此性能上比ArrayList要差,LinkedList使用雙向鏈表實現存儲,按序號索引數據須要進行向前或向後遍歷,可是插入數據時只須要記錄本項的先後項便可,因此插入數度較快!
1.ArrayList是實現了基於動態數組的數據結構,LinkedList基於鏈表的數據結構。
2.對於隨機訪問get和set,ArrayList以爲優於LinkedList,由於LinkedList要移動指針。
3.對於新增和刪除操做add和remove,LinedList比較佔優點,由於ArrayList要移動數據。
這一點要看實際狀況的。若只對單條數據插入或刪除,ArrayList的速度反而優於LinkedList。但如果批量隨機的插入刪除數據,LinkedList的速度大大優於ArrayList. 由於ArrayList每插入一條數據,要移動插入點及以後的全部數據。
一、HashMap經過hashcode對其內容進行快速查找,而TreeMap中全部的元素都保持着某種固定的順序,若是你須要獲得一個有序的結果你就應該使用TreeMap(HashMap中元素的排列順序是不固定的)。HashMap中元素的排列順序是不固定的)。
二、 HashMap經過hashcode對其內容進行快速查找,而TreeMap中全部的元素都保持着某種固定的順序,若是你須要獲得一個有序的結果你就應該使用TreeMap(HashMap中元素的排列順序是不固定的)。集合框架」提供兩種常規的Map實現:HashMap和TreeMap (TreeMap實現SortedMap接口)。
三、在Map 中插入、刪除和定位元素,HashMap 是最好的選擇。但若是您要按天然順序或自定義順序遍歷鍵,那麼TreeMap會更好。使用HashMap要求添加的鍵類明肯定義了hashCode()和 equals()的實現。 這個TreeMap沒有調優選項,由於該樹總處於平衡狀態。
一、歷史緣由:Hashtable是基於陳舊的Dictionary類的,HashMap是Java 1.2引進的Map接口的一個實現 。
二、同步性:Hashtable是線程安全的,也就是說是同步的,而HashMap是線程序不安全的,不是同步的 。
三、值:只有HashMap可讓你將空值做爲一個表的條目的key或value 。
一、對於隨機查詢與迭代遍歷操做,數組比全部的容器都要快。因此在隨機訪問中通常使用ArrayList
二、LinkedList使用雙向鏈表對元素的增長和刪除提供了很是好的支持,而ArrayList執行增長和刪除元素須要進行元素位移。
三、對於Vector而已,咱們通常都是避免使用。
四、將ArrayList當作首選,畢竟對於集合元素而已咱們都是進行遍歷,只有當程序的性能由於List的頻繁插入和刪除而下降時,再考慮LinkedList。
一、HashSet因爲使用HashCode實現,因此在某種程度上來講它的性能永遠比TreeSet要好,尤爲是進行增長和查找操做。
三、雖然TreeSet沒有HashSet性能好,可是因爲它能夠維持元素的排序,因此它仍是存在用武之地的。
一、HashMap與HashSet一樣,支持快速查詢。雖然HashTable速度的速度也不慢,可是在HashMap面前仍是稍微慢了些,因此HashMap在查詢方面能夠取代HashTable。
二、因爲TreeMap須要維持內部元素的順序,因此它一般要比HashMap和HashTable慢。