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

Java Collection 框架:List 介面與 ArrayList、LinkedList 核心特性解析

     編輯:Java 程式設計入門

List 介面核心契約

  • 有序:元素維持插入順序,索引從 0 開始。
  • 可重複:允許 null 與重複元素。
  • 非同步:非執行緒安全,多執行緒環境需外部同步(Collections.synchronizedList() 或 CopyOnWriteArrayList)。

兩大主流實作對比

特性ArrayListLinkedList
底層資料結構動態陣列 (Object[])雙向鏈結串列
隨機存取 get(index)O(1) 極快O(n) 需遍歷
尾端新增 add(E)均攤 O(1)(偶爾擴容複製)O(1)
頭端/中間插入刪除O(n) 需搬移元素O(1) 僅調整指標(已定位節點)
記憶體額外開銷低(陣列預留空間)高(每節點含 prev/next 參考)
實作介面List, RandomAccess, Cloneable, SerializableList, Deque, Cloneable, Serializable
適用場景頻繁隨機讀取、尾端新增、元素量較固定頻繁頭尾增刪、佇列/棧、元素量劇烈波動

迭代與安全移除範例


List<String> al = new ArrayList<>();
al.add("abc");
al.add("abcd");
al.add("abcde");

// 正確:使用 Iterator 移除
Iterator<String> it = al.iterator();
while (it.hasNext()) {
    String s = it.next();
    if ("abcd".equals(s)) {  // 注意:用 equals() 比較字串,而非 ==
        it.remove();         // 安全移除,避免 ConcurrentModificationException
    }
    System.out.println(s);
}
// 結果:abc, abcde

關鍵點:

  • 務必用 Iterator.remove(),不可在 for-each 或普通 for 迴圈中直接 list.remove()。
  • 字串比較請用 equals(),== 比較的是參考位址。

進階使用技巧

  • 指定初始容量:new ArrayList<>(100) 減少擴容複製開銷。
  • 轉陣列:String[] arr = list.toArray(new String[0])(JDK 11+ 推薦寫法)。
  • 只讀視圖:List<String> unmodifiable = Collections.unmodifiableList(list) 或 JDK 10+ List.copyOf(list)。
  • 並發安全替代:CopyOnWriteArrayList(讀多寫少)、Collections.synchronizedList()(一般同步)。

原始碼層面補充(JDK 17/21)

  • ArrayList 擴容策略:newCapacity = oldCapacity + (oldCapacity >> 1)(1.5 倍)。
  • LinkedList 實作 Deque,提供 push()/pop()/peek() 等棧/佇列操作。
  • 兩者皆實作 RandomAccess 標記介面(LinkedList 未實作),供演算法判斷是否適合隨機存取優化。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved