在使用JAVA的時候常常用到集合類(有時也稱容器類),下面對經常使用的容器類進行一下總結。首先看一張圖,瞭解一下集合類的結構以及他們之間的關係:html
Collection接口是 Set 、List 和 Queue 接口的父接口,提供了多數集合經常使用的方法聲明,包括 add()、remove()、contains() 、size() 、iterator() 等。java
其中各個方法的具體用法就再也不一一介紹了。算法
1、List接口數組
List 關心的是索引,與其餘集合相比,List特有的就是和索引相關的一些方法:get(int index) 、 add(int index,Object o) 、 indexOf(Object o) ;List是有序的Collection,使用此接口可以精確的控制每一個元素插入的位置。用戶可以使用索引(元素在List中的位置,相似於數組下標)來訪問List中的元素,這相似於Java的數組;另外List容許有相同的元素。安全
ArrayList 能夠將它理解成一個可增加的數組,它提供快速迭代和快速隨機訪問的能力,其底層使用數組實現的,查詢效率較高,可是增刪效率低且是線程不安全的。性能
LinkedList 中的元素之間是雙連接的,當須要快速插入和刪除時LinkedList成爲List中的不二選擇,其底層使用雙向循環鏈表實現,查詢效率低,但增刪元素效率比較高。ui
Vector 是ArrayList的線程安全版本,性能比ArrayList要低,如今已經不多使用。spa
2、Set接口.net
Set關心惟一性,它不容許重複。線程
HashSet 當不但願集合中有重複值,而且不關心元素之間的順序時可使用此類,使用哈希算法實現。
LinkedHashset 當不但願集合中有重複值,而且但願按照元素的插入順序進行迭代遍歷時可採用此類。
TreeSet 當不但願集合中有重複值,而且但願按照元素的天然順序進行排序時能夠採用此類。(天然順序意思是某種和插入順序無關,而是和元素自己的內容和特質有關的排序方式,譬如「abc」排在「abd」前面。)
3、Queue接口
Queue用於保存將要執行的任務列表。
LinkedList 一樣實現了Queue接口,能夠實現先進先出的隊列。
PriorityQueue 用來建立天然排序的優先級隊列。
4、Map接口
Map關心的是惟一的標識符。他將惟一的鍵映射到某個元素。固然鍵和值都是對象。
HashMap 當須要鍵值對錶示,又不關心順序時可採用HashMap,線程不安全,容許key或value爲NULL。
Hashtable 注意Hashtable中的t是小寫的,它是HashMap的線程安全版本,不容許key或value爲NULL。
LinkedHashMap 當須要鍵值對,而且關心插入順序時可採用它。
TreeMap 當須要鍵值對,並關心元素的天然排序時可採用它。
1.List類和Set類
List類和Set類是Collection集合接口的子接口。
Set子接口:無序,不容許重複。
List子接口:有序,能夠有重複元素。
Set和List對比:
Set:檢索元素效率低下,刪除和插入效率高,插入和刪除不會引發元素位置改變。
List:和數組相似,List能夠動態增加,查找元素效率高,插入刪除元素效率低,由於會引發其餘元素位置改變。
Set和List具體子類:
Set
|————HashSet:以哈希表的形式存放元素,插入刪除速度很快。
List
|————ArrayList:動態數組
|————LinkedList:鏈表、隊列、堆棧。
Array和java.util.Vector
Vector是一種老的動態數組,是線程同步的,效率很低,通常不同意使用。
2.HashMap和HashTable
a.HashMap去掉了HashTable的contains方法,可是加上了containsValue()和containsKey()方法。
b.HashTable同步的,而HashMap是非同步的,效率上比HashTable要高。
c.HashMap容許空鍵值,而HashTable不容許。
3.線程安全集合類與非線程安全集合類
LinkedList、ArrayList、HashSet是非線程安全的,Vector是線程安全的;
HashMap是非線程安全的,HashTable是線程安全的;
StringBuilder是非線程安全的,StringBuffer是線程安全的。
4.集合適用場景
對於查找和刪除較爲頻繁,且元素數量較多的應用,Set或Map是更好的選擇
ArrayList適用於經過爲位置來讀取元素的場景
LinkedList 適用於要頭尾操做或插入指定位置的場景
Vector 適用於要線程安全的ArrayList的場景
Stack 適用於線程安全的LIFO場景
HashSet 適用於對排序沒有要求的非重複元素的存放
TreeSet 適用於要排序的非重複元素的存放
HashMap 適用於大部分key-value的存取場景
TreeMap 適用於需排序存放的key-value場景