Vector 和 ArrayList 都實現了 List 接口,底層均基於動態數組,但設計初衷與適用場景截然不同。本文從線程安全、擴容機制、性能開銷等維度深度對比,助你做出正確選型。
| 特性 | ArrayList | Vector |
|---|---|---|
| 線程安全 | 非線程安全 | 同步方法,線程安全 |
| 擴容倍數 | 1.5 倍 + 1 | 2 倍(或自定義 capacityIncrement) |
| 性能 | 高(無同步開銷) | 低(同步鎖開銷) |
| 推薦場景 | 單線程、高頻隨機訪問 | 極少數需同步的舊代碼維護 |
Vector 的所有公共方法(如 add、get、remove)均以 synchronized 修飾,確保同一時刻僅有一個線程能寫入。這雖保證了安全性,但帶來顯著性能損耗。ArrayList 無同步機制,單線程下效率極高;多線程環境下建議使用 Collections.synchronizedList 包裝或改用 CopyOnWriteArrayList。
public void ensureCapacity(int minCapacity) {
int oldCapacity = elementData.length;
if (minCapacity > oldCapacity) {
int newCapacity = oldCapacity + (oldCapacity >> 1); // 1.5 倍
if (newCapacity < minCapacity) newCapacity = minCapacity;
elementData = Arrays.copyOf(elementData, newCapacity);
}
}
private void ensureCapacityHelper(int minCapacity) {
int oldCapacity = elementData.length;
if (minCapacity > oldCapacity) {
int newCapacity = (capacityIncrement > 0) ?
(oldCapacity + capacityIncrement) : (oldCapacity * 2); // 默認 2 倍
if (newCapacity < minCapacity) newCapacity = minCapacity;
elementData = Arrays.copyOf(elementData, newCapacity);
}
}
關鍵差異:ArrayList 固定 1.5 倍增長,Vector 默認翻倍,且可通過構造函數指定 capacityIncrement 自定義增量。
Vector 提供 indexOf(Object, int start) 指定起始位置查找,ArrayList 無此重載。Vector 保留了早期 Java 1.0 的 Enumeration 兼容方法(elements())。CopyOnWriteArrayList(讀多寫少)或 Collections.synchronizedList(寫多讀少)。LinkedList,但隨機訪問性能較差。Vector 是早期 Java 為線程安全設計的產物,同步粒度粗、擴容激進、性能較差。現代開發中,ArrayList 配合顯式同步工具或並發容器,能更靈活地平衡安全與性能。理解底層擴容邏輯,有助於預估內存佔用與避免頻繁擴容帶來的抖動。