一、集合組成
java集合主要由Map和Collection組成,Collection主要類圖如下(圖片來源於網路,懶得畫圖):
從上圖中能很明顯的看出來Collection下主要是Set、List和Queue,上圖主要涉及Set和List,某些不常用的集合,比如Queue還有ArrayDeque、PriorityQueue等實現類,Vector子類Stack,Set下EnumSet也未見展示
Map介面主要類圖如下
Map主要分為了HashMap、Hashtable、TreeMap,另外的WeakHashMap等應用場景不多,ConcurrentHashMap等屬於java.util.concurrent下子類,Map中IdentityHashMap和EnumMap等未見展示
二、常用場景:
Java常用集合一般適用場景:
Collection:
Collection是最基本的集合介面,一個Collection代表一組Object的集合,這些Object被稱作Collection的元素。Collection是一個介面,用以提供規範定義,不能被例項化使用。
Collection繼承了Iterable介面,實現這個Iterable介面的物件允許使用foreach進行遍歷,也就是說,所有的Collection集合物件都具有"foreach可遍歷性"。這個Iterable介面只有一個方法: iterator(java8之後多了forEach和Spliterator兩個default方法,在此不多展開),它返回一個代表當前集合物件的泛型<T>迭代器,用於之後的遍歷操作
List:List集合代表一個元素有序、可重複的集合,集合中每個元素都有其對應的順序索引。List集合允許加入重複元素,因為它可以通過索引來訪問指定位置的集合元素。List集合預設按元素的新增順序設定元素的索引
ArrayList:類似一個長度可變的陣列 ,它封裝了一個動態的增長的、允許再分配的Object[]陣列。適合查詢,不適合增刪
LinkedList:底層是雙向迴圈連結串列,實現List介面,能對它進行佇列操作,即可以根據索引來隨機訪問集合中的元素。同時它還實現Deque介面,即能將LinkedList當作雙端佇列使用,自然也可以被當作"棧來使用"。適合增刪,不適合查詢。
Vector:Vector和ArrayList在用法上幾乎完全相同,執行緒安全
Stack:Stack是Vector提供的一個子類,用於模擬"棧"這種資料結構(LIFO後進先出)
Set:元素無序,不可重複,Set判斷兩個物件相同不是使用"=="運算子,而是根據equals方法。也就是說,我們在加入一個新元素的時候,如果這個新元素物件和Set中已有物件進行注意equals比較都返回false,則Set就會接受這個新元素物件,否則拒絕。
HashSet:根據物件的雜湊值確定元素在集合中的位置
LinkedHashSet:LinkedHashSet集合也是根據元素的hashCode值來決定元素的儲存位置,但和HashSet不同的是,它同時使用連結串列維護元素的次序,這樣使得元素看起來是以插入的順序儲存的。當遍歷LinkedHashSet集合裡的元素時,LinkedHashSet將會按元素的新增順序來訪問集合裡的元素
TreeSet: 實現了對集合中的元素排序
Map:雙列集合的根介面,用於儲存具有鍵(key)、值(value)對映關係的元素,不能出現重複的鍵key,即同一個Map物件的任何兩個key通過equals方法比較結果總是返回false。
HashMap:用於儲存鍵值對映關係,兩個key通過equals()方法比較返回true、同時兩個key的hashCode值也必須相等
LinkedHashMap:LinkedHashMap也使用雙向連結串列來維護key-value對的次序,該連結串列負責維護Map的迭代順序,與key-value對的插入順序一致(注意和TreeMap對所有的key-value進行排序進行區
分)
TreeMap:TreeMap可以保證所有的key-value對處於有序狀態。
Hashtable:不常用,執行緒安全的hashmap,效能不及ConcurrentHashMap
Queue:Queue用於模擬"佇列"這種資料結構(先進先出 FIFO)。佇列的頭部儲存著佇列中存放時間最長的元素,佇列的尾部儲存著佇列中存放時間最短的元素。新元素插入(offer)到佇列的尾部,訪問元素(poll)操作會返回佇列頭部的元素,佇列不允許隨機訪問佇列中的元素
PriorityQueue:PriorityQueue並不是一個比較標準的佇列實現,PriorityQueue儲存佇列元素的順序並不是按照加入佇列的順序,而是按照演算法優先順序進行重新排序
Deque:Deque介面代表一個"雙端佇列",雙端佇列可以同時從兩端來新增、刪除元素,因此Deque的實現類既可以當成佇列使用、也可以當成棧使用
三、常見問題
Collection 和 Collections 的區別
Collection是java.util下的介面,它是各種集合結構的父介面,繼承於它的介面的主要有set和List,提供關於集合的一些操作,比如插入、刪除、判斷一個元素是否是其成員,遍歷等
Collections是java.util下的類,是針對集合類的一個工具類,提供一系列靜態方法,實現對集合的查詢、排序、替換等操作