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

Java 集合框架精要 (一):List 族群特性、效能陷阱與最佳實踐

     編輯:Java 相關知識

List 四大主力 — ArrayList、LinkedList、Vector、Stack — 底層結構差異導致截然不同的效能特徵。本文剖析八大維度,揭示「隨機存取用 ArrayList、頻繁增刪用 LinkedList」背後的資料結構原理,並給出轉換策略、同步處理、不可修改視圖等實戰技巧。

一、底層機制與資料結構

實現結構隨機存取中間增刪記憶體開銷
ArrayList動態陣列O(1) 極快O(N) 需搬移低 (連續記憶體)
Vector動態陣列 (同步)O(1)O(N)低
LinkedList雙向鏈表O(N) 需遍歷O(1) 僅改指標高 (節點額外指標)
Stack繼承 Vector (陣列)O(1)僅支援棧頂操作低

二、特殊功能定位

  • Stack:LIFO 棧,push/pop/peek,繼承 Vector 故同步
  • LinkedList:實作 Deque,可作**棧**、**隊列**、**雙端隊列** (addFirst/last, pollFirst/last)

三、記憶體擴容行為

  • 陣列基類:擴容時分配新陣列 (1.5倍+1),System.arraycopy 複製,舊陣列成垃圾 → GC 壓力
  • 鏈表基類:節點級分配,無批量複製,記憶體曲線平滑

四、同步與線程安全

  • Vector/Stack:內建同步 (方法級 synchronized),但複合操作仍需外部同步 (如檢查大小後取元素)
  • ArrayList/LinkedList:非同步,需 Collections.synchronizedList(list) 包裝或用 CopyOnWriteArrayList (讀多寫少)
  • 迭代器:均為 fail-fast,併發修改拋 ConcurrentModificationException

五、動態選型與轉換策略

場景 A:資料量未知,從 DB 讀出後幾乎只讀遍歷 → 先 LinkedList 累積,再轉 ArrayList 優化遍歷**


List<Row> temp = new LinkedList<>();
while (rs.next()) temp.add(mapRow(rs));
List<Row> fastList = new ArrayList<>(temp); // 一次性複製,後續極速遍歷

場景 B:資料量固定,需頻繁中間增刪 → ArrayList → LinkedList**


List<Item> list = new ArrayList<>(initialData);
// 需大量增刪時
list = new LinkedList<>(list); // 轉換成本 O(N),後續增刪 O(1)

轉換本質:建構子複製元素引用,new ArrayList(linkedList) / new LinkedList(arrayList)

六、toArray() 實現差異

  • 陣列基類:System.arraycopy 直接複製底層陣列 → 極快
  • 鏈表基類:新建陣列逐節點填入 → O(N) 且分配新記憶體

七、不可修改視圖


List<T> unmodifiable = Collections.unmodifiableList(list);
// 任何修改 (含迭代器 remove) 拋 UnsupportedOperationException

八、遍歷器選擇

  • 優先用 Iterator:統一介面、支援安全移除 (it.remove())
  • ListIterator:雙向游標 (hasPrevious/previous)、可修改/新增指定位置
  • Enumeration:舊版 API,不建議新代碼使用

九、工具類善用

java.util.Collections 提供排序 (sort)、二分搜 (binarySearch)、反轉 (reverse)、填充 (fill)、同步包裝、不可修改視圖、單例集合等豐富靜態方法,避免重複造輪子。

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