首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

Java 集合框架核心實現對比:ArrayList vs LinkedList vs Vector 全方位解析

     編輯:Java 綜合教學

List 介面三大實現類深度剖析與選型指南

Java 集合框架中 List 介面的三大主力實現——ArrayList、LinkedList、Vector,雖然都實現有序、可重複的元素集合,但底層資料結構、執行緒安全性、效能特徵截然不同。本文從原始碼、複雜度、擴容機制、適用場景四個維度全方位對比。

一、核心架構對比表

維度ArrayListLinkedListVector
底層結構動態陣列 (Object[])雙向鏈表 (Node<E>)動態陣列 (Object[])
執行緒安全非同步 (非安全)非同步 (非安全)同步 (安全,方法級 synchronized)
隨機存取O(1) 極快O(n) 需遍歷O(1)
頭尾插入/刪除O(n) 需搬移O(1) 僅改指標O(n)
中間插入/刪除O(n) 搬移元素O(n) 定位 + O(1) 改指標O(n)
記憶體開銷低 (連續記憶體)高 (每節點 3 引用)低
擴容策略1.5 倍 (newCapacity = old + old>>1)無擴容概念2 倍 (預設),可指定 capacityIncrement
實現介面List, RandomAccess, Cloneable, SerializableList, Deque, Cloneable, SerializableList, RandomAccess, Cloneable, Serializable

二、原始碼關鍵細節深度解析

ArrayList 核心機制

  • transient Object[] elementData:transient 避免序列化空槽位,writeObject 手動序列化實際大小。
  • 擴容觸點:add() → ensureCapacityInternal() → grow() → Arrays.copyOf()。
  • 快速失效:modCount 記錄結構性修改次數,迭代器遍歷時檢測並發修改拋 ConcurrentModificationException。
  • RandomAccess 標記介面:讓 Collections.binarySearch() 等演算法選擇索引而非迭代器二分查找。

LinkedList 核心機制

  • 靜態內部類 Node<E> { E item; Node<E> next, prev; } 組成雙向鏈表。
  • 維護 first/last 指標與 size 計數器。
  • 實現 Deque 介面,原生支援 push/pop/peek (Stack)、offer/poll/peek (Queue) 操作。
  • 索引定位優化:node(index) 判斷 index < (size >> 1) 從頭/尾雙向遍歷,縮減一半步數。

Vector 歷史包袱

  • JDK 1.0 產物,所有公共方法加 synchronized,鎖粒度粗,效能差。
  • 迭代器同步機制:建立迭代器期間若其他執行緒修改 Vector,後續調用迭代器方法拋 ConcurrentModificationException。
  • Stack 繼承 Vector:Stack<E> extends Vector<E> 違反組合優於繼承原則,官方建議用 Deque (如 ArrayDeque) 替代。

三、效能實測參考 (JDK 17, 100 萬元素)

操作ArrayListLinkedListVector
尾部新增 100 萬~15 ms~25 ms~45 ms
頭部新增 10 萬~1200 ms~3 ms~1300 ms
隨機存取 100 萬次~2 ms~1800 ms~3 ms
中間插入 10 萬~800 ms~900 ms (含定位)~850 ms
記憶體佔用~4 MB~24 MB~4 MB

四、選型決策樹

需要執行緒安全?
├── 是 → 考慮 Collections.synchronizedList(new ArrayList<>()) 
│         或 CopyOnWriteArrayList (讀多寫少)
│         或並發包 ConcurrentLinkedDeque
└── 否 → 主要操作是什麼?
        ├── 隨機存取/尾部新增/遍歷 → ArrayList (首選)
        ├── 頻繁頭尾增刪/佇列棧操作 → LinkedList / ArrayDeque
        ├── 固定大小/極致效能 → 基本陣列 T[] / VarHandle
        └── 不確定 → ArrayList (通用性最強)

五、最佳實踐與避坑指南

  1. 預估容量:new ArrayList<>(estimatedSize) 避免多次擴容複製。
  2. 面向介面編程:宣告用 List<String> list = new ArrayList<>();,便於後續替換實現。
  3. 避免 Vector/Stack:新代碼**禁用**,改用 ArrayList + 外部同步或並發集合。
  4. LinkedList 慎用:除非明確需要 Deque 語義或極頻繁頭尾操作,否則 ArrayList 綜合效能更優(CPU 緩存友好)。
  5. 並發場景:CopyOnWriteArrayList 適合「讀多寫少、遍歷時不允許鎖住」場景;寫入頻繁請用鎖分離或並發佇列。
  6. 序列化:ArrayList/LinkedList 均實現 Serializable,但 LinkedList 節點較多序列化較慢。

六、總結

ArrayList 是 90% 場景的最佳預設選擇;LinkedList 僅在雙端佇列/棧語義或極端頭尾操作場景發光發熱;Vector 與 Stack 為歷史遺留,**新項目嚴禁使用**。理解底層資料結構與複雜度,才能在架構設計與效能調優中做出正確抉擇。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved