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

Java 集合框架核心對決:Vector 與 ArrayList 深度差異分析

     編輯:Java 相關知識

繼承體系速覽

Collection
 └─ List
      ├─ ArrayList  (非同步、動態數組)
      ├─ Vector     (同步、動態數組、舊版遺留)
      └─ LinkedList (雙向鏈表、Deque)

核心差異對比表

特性ArrayListVector
線程安全非同步,多線程需外部同步方法級同步,線程安全
擴容策略1.5 倍 + 1 (newCapacity = old*3/2 + 1)2 倍 (或 capacityIncrement)
效能單線程下極快,無鎖開銷同步開銷大,訪問較慢
API 差異標準 List 接口額外提供 indexOf(obj, start) 等舊式方法
推薦場景現代開發首選極少數需內建同步的舊系統維護

源碼級擴容機制剖析

ArrayList

public void ensureCapacity(int minCapacity) {
    int oldCapacity = elementData.length;
    if (minCapacity > oldCapacity) {
        int newCapacity = (oldCapacity * 3) / 2 + 1;  // 1.5倍增長
        elementData = Arrays.copyOf(elementData, newCapacity);
    }
}

Vector

private void ensureCapacityHelper(int minCapacity) {
    int oldCapacity = elementData.length;
    if (minCapacity > oldCapacity) {
        int newCapacity = (capacityIncrement > 0) ? 
            (oldCapacity + capacityIncrement) : (oldCapacity * 2);  // 默認雙倍
        elementData = Arrays.copyOf(elementData, newCapacity);
    }
}

實戰選型指南

  1. 單線程 / 線程封閉環境 → ArrayList(零同步開銷,效能最優)
  2. 多線程寫入 → 推薦 Collections.synchronizedList(new ArrayList<>()) 或 並發包 CopyOnWriteArrayList,不建議直接用 Vector
  3. 頻繁頭尾增刪 → LinkedList(O(1) 插刪,但隨機訪問 O(n))
  4. 大量數據預知規模 → 建構時指定 initialCapacity 減少擴容拷貝

遺留代碼遷移提示

若遇舊代碼使用 Vector,評估是否真正需要其同步特性;若無,直接替換為 ArrayList 即可獲得效能提升。

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