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

Vector vs ArrayList 深度對比:API、同步、擴容、效能與替代方案

     編輯:Java 相關知識

兩者皆實作 List、底層**動態陣列**,但設計初衷與效能特徵迥異。本文從四大維度剖析,並給出選型建議。

1. API 相似度極高

兩者方法幾乎一一對應 (add/get/set/remove/size/contains 等)。Vector 保留部分舊版方法 (addElement/capacityIncrement/elementAt),**不建議使用**,統一用 List 介面方法。

2. 同步處理 (核心差異)

  • Vector:所有 public 方法 synchronized,**線程安全**,但鎖粒度粗、爭用嚴重、效能低。
  • ArrayList:非同步**,**非線程安全**,單執行緒/外部同步場景效能極佳。
  • 多執行緒需共享列表 → 用 Collections.synchronizedList(new ArrayList<>()) (鎖整個列表) 或 **CopyOnWriteArrayList** (讀多寫少、無鎖讀取) 或 **並發佇列/Map**。

3. 擴容機制

特性VectorArrayList
預設擴容倍數**2 倍** (capacityIncrement=0 時)**1.5 倍** (newCapacity = old + old>>1)
可調擴容增量建構子 Vector(int initial, int increment)不可調 (除非繼承重寫 grow())
預設初始容量1010 (Java 8+ 空列表延遲至首次 add 分配)

大量資料預知筆數 → **new ArrayList<>(預估大小)** 避免多次擴容複製。

4. 使用模式與替代方案

  • 隨機存取 (get/set by index):兩者皆 O(1),ArrayList 更快 (無同步開銷)。
  • 尾部增刪:O(1) (均攤)。
  • 中間/頭部增刪:O(n) 需位移,**頻繁中間操作請用 LinkedList (O(1) 增刪、O(n) 存取)** 或重新評估資料結構。
  • 極致效能/無並發:考慮**基本型別陣列 int[]** 或 **ArrayList + 外部同步**,避免 Vector/Collections.synchronizedList 鎖爭用。

選型決策樹

單執行緒 / 外部同步 / 並發讀多寫少 → ArrayList / CopyOnWriteArrayList
需舊版 API 相容 / 極簡單執行緒安全 → Vector (不推薦新專案)
頻繁頭尾增刪 / 佇列/棧語意 → ArrayDeque / LinkedList
基本型別大量運算 → 基本型別陣列 / Trove / FastUtil 專用集合
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved