【Java集合】1 集合概述

whynotyue 發表於 2020-10-18

Q:Java 中常用的集合有哪些?

Java 集合分為 Collection 和 Map

Collection

img

Colletion 包括 List、Set、Queue

List:有序集合,允許有重複元素,主要實現類有

  1. Vector:執行緒安全的動態陣列
  2. ArrayList:與 Vector 類似,基於動態陣列實現,支援隨機訪問,查詢快,增刪慢,因為要移動後續所有的元素,但它不是執行緒安全的,效能更好;底層都是使用物件陣列儲存資料,當陣列滿時,會自動擴容,建立新的陣列,並拷貝原有陣列資料,擴容後容量 ArrayList 增加 50%,Vector 增加一倍。
  3. LinkedList:基於雙向連結串列實現,只能順序訪問,查詢慢,增刪快。

Set:是 Map 的馬甲,和 List 最大的區別是,不允許有重複元素,主要實現類有

  1. HashSet:基於 HashMap 實現,底層建立了一個 Dummy 物件 “PRESENT” 作為 value,所有元素以鍵的形式放入 HashMap 中,即 HashSet 是以雜湊演算法來儲存元素,所以雜湊正常時,能提供常數時間的 add、contain 操作,但不保證有序。
  2. LinkedHashSet:HashSet 的子類,基於 LinkedHashMap 實現,底層使用雙向連結串列維護元素插入的順序,同時能提供常數時間的 add、contain 操作,但效能略低於 HashSet,因為有需要維護連結串列的開銷。
  3. TreeSet:基於 TreeMap 實現,支援順序訪問,預設按值升序,也可以由指定的 Comparator 來決定,但 add、contain 操作效率為 O(logN)。

Queue:主要實現類有

  1. LinkedList:用來實現棧、佇列和雙向佇列。
  2. PriorityQueue:基於堆實現,可用來實現優先佇列。

Map

img

Map 儲存鍵值對,主要實現類有:

  1. Hashtable:基於雜湊表實現,不支援 null 鍵和值,由於同步導致效能較差,不推薦使用。
  2. HashMap:與 Hashtable 類似,基於雜湊表實現,但支援 null 鍵和值,並且不是執行緒安全的,效能更好;雜湊正常時,能提供常數時間的 put / get 操作,但不保證有序;如果需要滿足執行緒安全,可以用 Collections.synchronizedMap() 使 HashMap 具備執行緒安全的能力,或者直接用效能更好的 ConcurrentHashMap。
  3. LinkedHashMap:HashMap 的子類,底層使用雙向連結串列維護元素插入的順序,也可以構造時設定 accessOrder 為 true,轉換成訪問順序;同時能提供常數時間的 put / get 操作,但效能略低於 HashMap,因為有需要維護連結串列的開銷。
  4. TreeMap:基於紅黑樹實現,支援順序訪問,預設按鍵值升序,也可以由指定的 Comparator 來決定,但 put / get 效率為 O(logN);使用時,key 必須實現 Comparable 介面或者在構造時傳入指定的 Comparator,否則執行時會丟擲 ClassCastException。

對於這些 Map,都要求 key 是不可變物件,確保建立後它的雜湊值不變;

因為如果發生改變,Map 就可能定位不到對映的位置。