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

Java 集合框架精解(一):Collection 體系、ArrayList 與 LinkedList 效能全分析

     編輯:J2SE

前言

Java 集合框架是處理物件群組的核心 API。本文系統梳理 Collection 體系架構,並深度剖析 ArrayList 與 LinkedList 的底層資料結構、核心方法實作與效能特徵,助你做出正確選型。

一、 集合框架總覽

核心介面體系

Iterable (根介面)
 └── Collection
      ├── List      有序、可重複
      │    ├── ArrayList
      │    ├── LinkedList
      │    └── Vector (舊)
      ├── Set       無序、唯一
      │    ├── HashSet
      │    ├── LinkedHashSet
      │    └── TreeSet
      └── Queue     佇列
           ├── PriorityQueue
           └── Deque (雙端佇列)

Map** 不繼承 Collection,另成體系。

為何需要集合類?

  • 陣列長度固定,執行期無法動態調整。
  • 集合類提供高效資料結構(動態陣列、鏈表、樹、雜湊表)。
  • 統一介面實現多態互操作,易擴充修改。

二、 ArrayList:動態陣列,隨機存取之王

底層結構

  • 以**物件陣列** Object[] elementData 儲存元素。
  • 預設初始容量 10,擴容機制:**新容量 = 旧容量 * 1.5 + 1**。

核心方法效能分析

方法時間複雜度說明
get(int index)O(1)下標直接存取,極快
set(int index, E)O(1)下標直接替換,極快
add(E)均攤 O(1)尾端新增,偶爾觸發擴容複製
add(int index, E)O(n)需移動 index 後所有元素
remove(int index)O(n)需移動 index 後所有元素
remove(Object)O(n)線性查找 + 移動元素
indexOf(Object)O(n)線性查找

三、 LinkedList:雙向鏈表,插刪高手

底層結構

  • **雙向鏈表**,每個節點含 prev、next、item 三欄位。
  • 內部私有類 Node<E> (JDK 8 以前稱 Entry)。
  • 維護 first、last 指標與 size 計數。

核心方法效能分析

方法時間複雜度說明
get(int index)O(n)需從頭/尾遍歷至索引位置
set(int index, E)O(n)需先定位節點
add(E)O(1)尾端插入,僅調整指標
add(int index, E)O(n)需定位插入點,但無元素移動
remove(int index)O(n)需定位節點,僅調整指標
remove(Object)O(n)查找 + 調整指標
addFirst/addLastO(1)首/尾插入,極快
removeFirst/removeLastO(1)首/尾移除,極快

四、 選型決策指南

選 ArrayList 當:

  • 頻繁隨機存取(get/set by index)。
  • 主要在尾端新增,極少中間插刪。
  • 記憶體敏感(LinkedList 節點額外佔用 ~2 個引用)。

選 LinkedList 當:

  • 頻繁在頭尾或中間插入/刪除。
  • 需實作佇列、棧、雙端佇列(Deque 介面)。
  • 資料量大且插刪頻繁,避免陣列複製開銷。

五、 實務建議

  1. 預估大小:若能預估元素數量,用 new ArrayList<>(initialCapacity) 避免多次擴容。
  2. 並發環境:兩者皆非執行緒安全,多執行緒下用 Collections.synchronizedList() 或 CopyOnWriteArrayList / 併發佇列。
  3. 不可變視圖:Java 9+ 可用 List.of() 建立不可變列表。

六、 總結

ArrayList 以動態陣列實現,隨機存取 O(1) 但插刪 O(n);LinkedList 以雙向鏈表實現,插刪 O(1) 但隨機存取 O(n)。理解底層機制,依據存取模式選型,是寫出高效 Java 程式的關鍵。

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