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

Java List 集合完全指南:ArrayList vs LinkedList、遍歷方式、隊列棧模擬與性能選型

     編輯:Java 相關知識

Java List 接口深度掌握:實現原理、遍歷模式、性能基準、隊列棧模擬與避坑指南

List<E> 是 Java 集合框架中最常用的有序、可重複元素容器。本文系統對比 ArrayList、LinkedList、Vector 核心差異,解析 5 種遍歷方式性能,實戰隊列棧模擬,建立完整選型決策模型。

三大實現類核心對比

特性ArrayListLinkedListVector (legacy)
底層結構動態數組 Object[]雙向鏈表動態數組
隨機訪問 get(i)O(1) ⚡O(n) 🐢O(1)
頭/尾插入刪除O(n) / O(1)*O(1) ⚡O(n) / O(1)*
中間插入刪除O(n)O(1) 定位後O(n)
內存開銷低 (連續)高 (節點對象)低
線程安全❌❌✅ (同步方法)
擴容機制1.5倍無2倍
實現接口List, RandomAccess, Cloneable, SerializableList, Deque, Cloneable, SerializableList, RandomAccess...

* 尾部插入攤銷 O(1),擴容時 O(n)

遍歷方式性能大比拼 (100萬元素, JDK 17)

方式代碼模式ArrayListLinkedList推薦指數
1. 傳統 for 索引for(int i=0;i<size;i++) list.get(i)⚡ 最快🐢 極慢 (O(n²))ArrayList ✅
2. 增強 for (for-each)for(E e : list)⚡ 快 (隱式迭代器)⚡ 快 (隱式迭代器)通用 ✅✅✅
3. 顯式 IteratorIterator<E> it=list.iterator()⚡ 快⚡ 快需刪除時 ✅
4. ListIteratorListIterator<E> it=list.listIterator()⚡ 快 (雙向)⚡ 快 (雙向)需反向/修改 ✅
5. Stream APIlist.stream().forEach()快 (略慢於 for-each)快函數式鏈式 ✅
6. 並行流list.parallelStream().forEach()多核加速 (大數據)❌ 不推薦 (分割困難)CPU 密集 ✅

遍歷代碼範例

List list = new ArrayList<>(List.of("A", "B", "C"));

// 1. 增強 for (最通用、最推薦)
for (String s : list) { System.out.println(s); }

// 2. Iterator (需邊遍歷邊刪除)
Iterator it = list.iterator();
while (it.hasNext()) {
    String s = it.next();
    if ("B".equals(s)) it.remove(); // 安全刪除
}

// 3. ListIterator (反向遍歷、指定位置插入)
ListIterator lit = list.listIterator(list.size());
while (lit.hasPrevious()) {
    System.out.println(lit.previous()); // 反向輸出
}

// 4. Stream (函數式鏈式操作)
list.stream()
    .filter(s -> s.compareTo("B") > 0)
    .map(String::toLowerCase)
    .forEach(System.out::println);

// 5. 傳統 for (ArrayList 專用高性能)
for (int i = 0, n = list.size(); i < n; i++) {
    String s = list.get(i); // O(1)
}

LinkedList 模擬隊列與棧

LinkedList 實現 Deque 接口,原生支援隊列 (FIFO) 和棧 (LIFO):

// 隊列 (FIFO: 先進先出)
Deque queue = new LinkedList<>();
queue.addLast("task1"); // 入隊
queue.addLast("task2");
String head = queue.removeFirst(); // 出隊 -> "task1"
String peek = queue.peekFirst();   // 查看隊首不移除

// 棧 (LIFO: 後進先出)
Deque stack = new LinkedList<>();
stack.addFirst("frame1"); // 入棧
stack.addFirst("frame2");
String top = stack.removeFirst(); // 出棧 -> "frame2"
String peekTop = stack.peekFirst(); // 查看棧頂

// 封裝工具類
public class DequeUtils {
    public static  Queue newQueue() { return new LinkedList<>(); }
    public static  Deque newStack() { return new LinkedList<>(); }
    
    // 隊列操作
    public static  void enqueue(Queue q, E e) { ((Deque)q).addLast(e); }
    public static  E dequeue(Queue q) { return ((Deque)q).removeFirst(); }
    
    // 棧操作
    public static  void push(Deque s, E e) { s.addFirst(e); }
    public static  E pop(Deque s) { return s.removeFirst(); }
}

線程安全 List 選型

方案適用場景性能代碼示例
Collections.synchronizedList低併發、簡單同步中等 (全鎖)List<T> list = Collections.synchronizedList(new ArrayList<>());
CopyOnWriteArrayList讀多寫少、遍歷不阻塞寫入慢 (複製數組)List<T> list = new CopyOnWriteArrayList<>();
手動同步複雜邏輯、批量操作可控synchronized(list) { ... }
並發佇列生產者消費者高 (無鎖/CAS)Queue<T> q = new ConcurrentLinkedQueue<>();

選型決策樹

需要 List
    │
    ├─ 高頻隨機訪問 get(i)、末尾增刪、內存敏感 → ArrayList (默認首選)
    ├─ 高頻頭部/中間增刪、需隊列/棧語義 → LinkedList
    ├─ 多線程讀多寫少、遍歷不阻塞 → CopyOnWriteArrayList
    ├─ 多線程寫多、需復合操作原子性 → Collections.synchronizedList + 手動鎖
    ├─ 異步生產消費 → ConcurrentLinkedQueue / LinkedBlockingQueue
    └─ 歷史代碼維護 → Vector (新代碼禁用)

常見陷阱避坑

  1. Arrays.asList() 返回固定大小列表:不可增刪,只能修改元素。需 new ArrayList<>(Arrays.asList(...))
  2. List.contains() 依賴 equals():自定義對象必須重寫 equals() 和 hashCode()
  3. subList() 返回視圖:修改子列表影響原列表,且非獨立序列化
  4. for-each 循環中 remove() 拋 ConcurrentModificationException:必須用 Iterator.remove()
  5. LinkedList 非 RandomAccess:誤用索引遍歷導致 O(n²) 性能災難
  6. 自動裝箱開銷:List<Integer> 存儲基本類型有對象開銷,大數據考慮 IntList (Eclipse Collections/FastUtil)

Java 9+ 不可變 List 工廠方法

// 只有元素,不可修改 (結構+內容)
List immutable = List.of("A", "B", "C"); // Java 9
List immutable2 = List.copyOf(mutableList); // Java 10

// 特性:Null 不允許、結構不可變、元素不可變 (若元素本身不可變)、
// 實現類為內部類、序列化支援、極致內存緊湊
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved