一 概述
Java 集合, 也叫作容器,主要是由兩大介面派生而來:一個是 Collection
介面,主要用於存放單一元素;另一個是 Map
介面,主要用於存放鍵值對。對於Collection
介面,下面又有三個主要的子介面:List
、Set
和 Queue
Java 集合框架如下圖所示:
List
ArrayList
:Object[]
陣列。Vector
:Object[]
陣列。LinkedList
:雙向連結串列(JDK1.6 之前為迴圈連結串列,JDK1.7 取消了迴圈)。
Set
HashSet
(無序,唯一): 基於HashMap
實現的,底層採用HashMap
來儲存元素。LinkedHashSet
:LinkedHashSet
是HashSet
的子類,並且其內部是透過LinkedHashMap
來實現的。TreeSet
(有序,唯一): 紅黑樹(自平衡的排序二叉樹)。
Queue
PriorityQueue
:Object[]
陣列來實現小頂堆。DelayQueue
:PriorityQueue
。ArrayDeque
: 可擴容動態雙向陣列。
Map
HashMap
:JDK1.8 之前HashMap
由陣列+連結串列組成的,陣列是HashMap
的主體,連結串列則是主要為了解決雜湊衝突而存在的(“拉鍊法”解決衝突)。JDK1.8 以後在解決雜湊衝突時有了較大的變化,當連結串列長度大於閾值(預設為 8)(將連結串列轉換成紅黑樹前會判斷,如果當前陣列的長度小於 64,那麼會選擇先進行陣列擴容,而不是轉換為紅黑樹)時,將連結串列轉化為紅黑樹,以減少搜尋時間。LinkedHashMap
:LinkedHashMap
繼承自HashMap
,所以它的底層仍然是基於拉鍊式雜湊結構即由陣列和連結串列或紅黑樹組成。另外,LinkedHashMap
在上面結構的基礎上,增加了一條雙向連結串列,使得上面的結構可以保持鍵值對的插入順序。同時透過對連結串列進行相應的操作,實現了訪問順序相關邏輯。Hashtable
:陣列+連結串列組成的,陣列是Hashtable
的主體,連結串列則是主要為了解決雜湊衝突而存在的。TreeMap
:紅黑樹(自平衡的排序二叉樹)。
二 常見面試問題
1. ArrayList和Vector區別
Vector
和Stack
兩者都是執行緒安全的,都是使用synchronized
關鍵字進行同步處理。Stack
繼承自Vector
,是一個後進先出的棧,而Vector
是一個列表。
隨著 Java 併發程式設計的發展,Vector
和 Stack
已經被淘汰,推薦使用併發集合類(例如 ConcurrentHashMap
、CopyOnWriteArrayList
等)或者手動實現執行緒安全的方法來提供安全的多執行緒操作支援。
2. ArrayList 可以新增 null 值嗎?
ArrayList
中可以儲存任何型別的物件,包括 null
值。不過,不建議向ArrayList
中新增 null
值, null
值無意義,會讓程式碼難以維護比如忘記做判空處理就會導致空指標異常。
3. ArrayList與LinkedList的區別
ArrayList
中可以儲存任何型別的物件,包括 null
值。不過,不建議向ArrayList
中新增 null
值, null
值無意義,會讓程式碼難以維護比如忘記做判空處理就會導致空指標異常。