資料結構總綱

balfish發表於2024-03-03

一 概述

Java 集合, 也叫作容器,主要是由兩大介面派生而來:一個是 Collection介面,主要用於存放單一元素;另一個是 Map 介面,主要用於存放鍵值對。對於Collection 介面,下面又有三個主要的子介面:ListSetQueue

Java 集合框架如下圖所示:

List

  • ArrayListObject[] 陣列。
  • VectorObject[] 陣列。
  • LinkedList:雙向連結串列(JDK1.6 之前為迴圈連結串列,JDK1.7 取消了迴圈)。

Set

  • HashSet(無序,唯一): 基於 HashMap 實現的,底層採用 HashMap 來儲存元素。
  • LinkedHashSet: LinkedHashSetHashSet 的子類,並且其內部是透過 LinkedHashMap 來實現的。
  • TreeSet(有序,唯一): 紅黑樹(自平衡的排序二叉樹)。

Queue

  • PriorityQueue: Object[] 陣列來實現小頂堆。
  • DelayQueue:PriorityQueue
  • ArrayDeque: 可擴容動態雙向陣列。

Map

  • HashMap:JDK1.8 之前 HashMap 由陣列+連結串列組成的,陣列是 HashMap 的主體,連結串列則是主要為了解決雜湊衝突而存在的(“拉鍊法”解決衝突)。JDK1.8 以後在解決雜湊衝突時有了較大的變化,當連結串列長度大於閾值(預設為 8)(將連結串列轉換成紅黑樹前會判斷,如果當前陣列的長度小於 64,那麼會選擇先進行陣列擴容,而不是轉換為紅黑樹)時,將連結串列轉化為紅黑樹,以減少搜尋時間。
  • LinkedHashMapLinkedHashMap 繼承自 HashMap,所以它的底層仍然是基於拉鍊式雜湊結構即由陣列和連結串列或紅黑樹組成。另外,LinkedHashMap 在上面結構的基礎上,增加了一條雙向連結串列,使得上面的結構可以保持鍵值對的插入順序。同時透過對連結串列進行相應的操作,實現了訪問順序相關邏輯。
  • Hashtable:陣列+連結串列組成的,陣列是 Hashtable 的主體,連結串列則是主要為了解決雜湊衝突而存在的。
  • TreeMap:紅黑樹(自平衡的排序二叉樹)。

二 常見面試問題

1. ArrayList和Vector區別

  • VectorStack 兩者都是執行緒安全的,都是使用 synchronized 關鍵字進行同步處理。
  • Stack 繼承自 Vector,是一個後進先出的棧,而 Vector 是一個列表。

隨著 Java 併發程式設計的發展,VectorStack 已經被淘汰,推薦使用併發集合類(例如 ConcurrentHashMapCopyOnWriteArrayList 等)或者手動實現執行緒安全的方法來提供安全的多執行緒操作支援。

2. ArrayList 可以新增 null 值嗎?

ArrayList 中可以儲存任何型別的物件,包括 null 值。不過,不建議向ArrayList 中新增 null 值, null 值無意義,會讓程式碼難以維護比如忘記做判空處理就會導致空指標異常。

3. ArrayList與LinkedList的區別
ArrayList 中可以儲存任何型別的物件,包括 null 值。不過,不建議向ArrayList 中新增 null 值, null 值無意義,會讓程式碼難以維護比如忘記做判空處理就會導致空指標異常。

相關文章