兩者皆實作 List、底層**動態陣列**,但設計初衷與效能特徵迥異。本文從四大維度剖析,並給出選型建議。
兩者方法幾乎一一對應 (add/get/set/remove/size/contains 等)。Vector 保留部分舊版方法 (addElement/capacityIncrement/elementAt),**不建議使用**,統一用 List 介面方法。
synchronized,**線程安全**,但鎖粒度粗、爭用嚴重、效能低。Collections.synchronizedList(new ArrayList<>()) (鎖整個列表) 或 **CopyOnWriteArrayList** (讀多寫少、無鎖讀取) 或 **並發佇列/Map**。| 特性 | Vector | ArrayList |
|---|---|---|
| 預設擴容倍數 | **2 倍** (capacityIncrement=0 時) | **1.5 倍** (newCapacity = old + old>>1) |
| 可調擴容增量 | 建構子 Vector(int initial, int increment) | 不可調 (除非繼承重寫 grow()) |
| 預設初始容量 | 10 | 10 (Java 8+ 空列表延遲至首次 add 分配) |
大量資料預知筆數 → **new ArrayList<>(預估大小)** 避免多次擴容複製。
LinkedList (O(1) 增刪、O(n) 存取)** 或重新評估資料結構。int[]** 或 **ArrayList + 外部同步**,避免 Vector/Collections.synchronizedList 鎖爭用。單執行緒 / 外部同步 / 並發讀多寫少 → ArrayList / CopyOnWriteArrayList
需舊版 API 相容 / 極簡單執行緒安全 → Vector (不推薦新專案)
頻繁頭尾增刪 / 佇列/棧語意 → ArrayDeque / LinkedList
基本型別大量運算 → 基本型別陣列 / Trove / FastUtil 專用集合