java基礎詳解-集合

瀟視發表於2021-03-14

一、集合組成

  java集合主要由MapCollection組成,Collection主要類圖如下(圖片來源於網路,懶得畫圖)

 

  從上圖中能很明顯的看出來Collection下主要是SetListQueue,上圖主要涉及SetList,某些不常用的集合,比如Queue還有ArrayDequePriorityQueue等實現類,Vector子類StackSetEnumSet也未見展示

  Map介面主要類圖如下

Map主要分為了HashMapHashtableTreeMap,另外的WeakHashMap等應用場景不多,ConcurrentHashMap等屬於java.util.concurrent下子類,MapIdentityHashMapEnumMap等未見展示

二、常用場景:

Java常用集合一般適用場景:

Collection

Collection是最基本的集合介面,一個Collection代表一組Object的集合,這些Object被稱作Collection的元素。Collection是一個介面,用以提供規範定義,不能被例項化使用。

Collection繼承了Iterable介面,實現這個Iterable介面的物件允許使用foreach進行遍歷,也就是說,所有的Collection集合物件都具有"foreach可遍歷性"。這個Iterable介面只有一個方法: iteratorjava8之後多了forEachSpliterator兩個default方法,在此不多展開),它返回一個代表當前集合物件的泛型<T>迭代器,用於之後的遍歷操作

 

ListList集合代表一個元素有序、可重複的集合,集合中每個元素都有其對應的順序索引。List集合允許加入重複元素,因為它可以通過索引來訪問指定位置的集合元素。List集合預設按元素的新增順序設定元素的索引

ArrayList:類似一個長度可變的陣列 ,它封裝了一個動態的增長的、允許再分配的Object[]陣列。適合查詢,不適合增刪

LinkedList:底層是雙向迴圈連結串列,實現List介面,能對它進行佇列操作,即可以根據索引來隨機訪問集合中的元素。同時它還實現Deque介面,即能將LinkedList當作雙端佇列使用,自然也可以被當作"棧來使用"。適合增刪,不適合查詢。

VectorVectorArrayList在用法上幾乎完全相同,執行緒安全

StackStackVector提供的一個子類,用於模擬""這種資料結構(LIFO後進先出)

 

Set:元素無序,不可重複,Set判斷兩個物件相同不是使用"=="運算子,而是根據equals方法。也就是說,我們在加入一個新元素的時候,如果這個新元素物件和Set中已有物件進行注意equals比較都返回false,則Set就會接受這個新元素物件,否則拒絕。

HashSet:根據物件的雜湊值確定元素在集合中的位置

LinkedHashSetLinkedHashSet集合也是根據元素的hashCode值來決定元素的儲存位置,但和HashSet不同的是,它同時使用連結串列維護元素的次序,這樣使得元素看起來是以插入的順序儲存的。當遍歷LinkedHashSet集合裡的元素時,LinkedHashSet將會按元素的新增順序來訪問集合裡的元素

TreeSet: 實現了對集合中的元素排序

 

Map:雙列集合的根介面,用於儲存具有鍵(key)、值(value)對映關係的元素,不能出現重複的鍵key,即同一個Map物件的任何兩個key通過equals方法比較結果總是返回false

HashMap:用於儲存鍵值對映關係,兩個key通過equals()方法比較返回true、同時兩個keyhashCode值也必須相等

LinkedHashMapLinkedHashMap也使用雙向連結串列來維護key-value對的次序,該連結串列負責維護Map的迭代順序,與key-value對的插入順序一致(注意和TreeMap對所有的key-value進行排序進行區

)

TreeMapTreeMap可以保證所有的key-value對處於有序狀態。

Hashtable:不常用,執行緒安全的hashmap,效能不及ConcurrentHashMap

 

QueueQueue用於模擬"佇列"這種資料結構(先進先出 FIFO)。佇列的頭部儲存著佇列中存放時間最長的元素,佇列的尾部儲存著佇列中存放時間最短的元素。新元素插入(offer)到佇列的尾部,訪問元素(poll)操作會返回佇列頭部的元素,佇列不允許隨機訪問佇列中的元素

PriorityQueuePriorityQueue並不是一個比較標準的佇列實現,PriorityQueue儲存佇列元素的順序並不是按照加入佇列的順序,而是按照演算法優先順序進行重新排序

DequeDeque介面代表一個"雙端佇列",雙端佇列可以同時從兩端來新增、刪除元素,因此Deque的實現類既可以當成佇列使用、也可以當成棧使用

 

三、常見問題

Collection Collections 的區別

  Collectionjava.util下的介面,它是各種集合結構的父介面,繼承於它的介面的主要有setList,提供關於集合的一些操作,比如插入、刪除、判斷一個元素是否是其成員,遍歷等

  Collectionsjava.util下的類,是針對集合類的一個工具類,提供一系列靜態方法,實現對集合的查詢、排序、替換等操作

 

相關文章