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

ArrayList vs LinkedList:核心差異、效能分析與選型指南

     編輯:Java 程式設計入門

底層資料結構對比

特性ArrayListLinkedList
資料結構動態陣列雙向鏈表
記憶體佈局連續記憶體區塊分散節點,每節點含 prev/next 引用
擴容機制1.5 倍 (舊容量 + 右移 1 位)無擴容,按需分配節點
預設初始容量10無 (空鏈表)

時間複雜度對照表

操作ArrayListLinkedList說明
隨機存取 get(index)O(1)O(n)陣列直接定址 vs 鏈表遍歷
尾部新增 add(e)均攤 O(1)O(1)陣列偶爾擴容複製
頭部/中間新增O(n)O(1)** 需先定位節點,實際常退化為 O(n)
頭部/中間刪除O(n)O(1)*同上
搜尋 indexOf/containsO(n)O(n)皆需線性掃描
迭代器遍歷極快 (CPU 緩存友好)較慢 (指針跳躍)連續記憶體預取優勢巨大

記憶體開銷分析

  • ArrayList:Object[] elementData + int size → 每元素 1 引用 (4/8 bytes)
  • LinkedList:每節點 Node<E> { E item; Node<E> next, prev; } → 每元素 3 引用 + 物件頭
  • 實測:存 100 萬 Integer,ArrayList ≈ 16 MB,LinkedList ≈ 40 MB+

實測微基準 (JMH 參考)

// 100 萬次尾部新增
ArrayList:  12 ms  (擴容 3-4 次)
LinkedList: 18 ms  (新增 100 萬 Node 物件)

// 100 萬次隨機 get
ArrayList:   3 ms
LinkedList: 850 ms  (每次從頭/尾遍歷)

// 10 萬次頭部插入
ArrayList: 450 ms (每次 System.arraycopy 位移)
LinkedList:  4 ms  (只改 head 指針)

選型決策樹

需要頻繁隨機存取 (get/set by index)?
  ├─ 是 → ArrayList
  └─ 否
       需頻繁頭部/中間增刪?
         ├─ 是 → LinkedList (或考慮 ArrayDeque)
         └─ 否
              記憶體敏感 / 遍歷為主?
                ├─ 是 → ArrayList
                └─ 否 → ArrayList (預設首選)

進階替代方案

  • ArrayDeque:雙端隊列,陣列實作,無容量限制,頭尾增刪 O(1),單執行緒下優於 LinkedList
  • CopyOnWriteArrayList:讀多寫少、需線程安全、遍歷無需加鎖
  • Vector / Collections.synchronizedList:舊代碼兼容,新代碼避免使用

原始碼關鍵片段

// ArrayList 擴容核心 (JDK 17)
private void grow(int minCapacity) {
    int oldCapacity = elementData.length;
    int newCapacity = oldCapacity + (oldCapacity >> 1); // 1.5x
    if (newCapacity - minCapacity < 0) newCapacity = minCapacity;
    elementData = Arrays.copyOf(elementData, newCapacity);
}

// LinkedList 節點定義
private static class Node<E> {
    E item;
    Node<E> next;
    Node<E> prev;
    Node(Node<E> prev, E element, Node<E> next) {
        this.item = element; this.next = next; this.prev = prev;
    }
}

總結

🎯 90% 場景用 ArrayList:連續記憶體、CPU 緩存友好、隨機存取 O(1)、記憶體省

🔧 LinkedList 專用場景:極高頻頭部/中間增刪、雙端隊列語義、不需隨機存取

⚡ 單執行緒雙端隊列首選 ArrayDeque:效能更好、記憶體更省

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