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

深度解析 ArrayList 與 Vector 核心差異:從 JDK 6 源碼看同步機制與擴容策略

     編輯:Java 相關知識

許多 Java 開發者都知道 ArrayList 非同步、Vector 同步,但很少有人深入源碼層面剖析兩者的具體實現差異。本文基於 JDK 6.0_04 源碼,從類聲明、建構子、核心方法、內部欄位、擴充方法五個維度,揭示兩者的真正區別。

1. 類聲明:完全一致

public class ArrayList<E> extends AbstractList<E>
    implements List<E>, RandomAccess, Cloneable, java.io.Serializable;

public class Vector<E> extends AbstractList<E>
    implements List<E>, RandomAccess, Cloneable, java.io.Serializable;

兩者繼承體系、實作介面完全相同,均支援隨機存取、複製與序列化。

2. 建構子:Vector 多一個擴容增量參數

// ArrayList
public ArrayList(int initialCapacity);

// Vector
public Vector(int initialCapacity);
public Vector(int initialCapacity, int capacityIncrement); // 獨有:指定每次擴容增量

預設初始容量均為 10。Vector 額外提供 capacityIncrement 參數,允許自訂擴容步長;ArrayList 則固定為 1.5 倍擴容(newCapacity = oldCapacity + (oldCapacity >> 1))。

3. 核心方法:同步是最大差異

// ArrayList - 非同步
public boolean add(E e);

// Vector - 同步
public synchronized boolean add(E e);

Vector 所有公有方法(add、get、set、remove 等)均標記 synchronized,確保執行緒安全;ArrayList 則無同步機制,效能較佳但非執行緒安全。

4. 內部欄位命名差異

ArrayList: private int size;
Vector:    private int elementCount;

語義相同,僅命名風格不同,反映早期設計習慣。

5. Vector 獨有的豐富 API(均為同步)

Vector 保留大量 Java 1.0 時代的傳統方法,部分與 List 介面方法功能重疊:

public synchronized void copyInto(Object[] anArray);
public synchronized void setSize(int newSize);
public synchronized int capacity();
public Enumeration<E> elements(); // 返回 Enumeration 而非 Iterator
public synchronized E elementAt(int index);
public synchronized E firstElement();
public synchronized E lastElement();
public synchronized void setElementAt(E obj, int index);
public synchronized void removeElementAt(int index);
public synchronized void insertElementAt(E obj, int index);
public synchronized void addElement(E obj);
public synchronized boolean removeElement(Object obj);
public synchronized void removeAllElements();

這些方法為相容舊代碼而保留,現代開發建議優先使用 List 介面標準方法。

效能與選型建議

  • 單執行緒/高效能場景:優先選 ArrayList,避免同步開銷
  • 多執行緒環境:若需執行緒安全,建議使用 Collections.synchronizedList(new ArrayList<>()) 或 CopyOnWriteArrayList,而非直接用 Vector
  • 維護舊系統:若代碼大量依賴 elementAt、elements() 等傳統 API,Vector 可減少重構成本

總結:Vector 是早期 Java 集合框架的產物,同步機制雖提供便利,但粒度較粗、擴容策略較死板。現代開發中,ArrayList 搭配顯式同步或並發容器,通常能獲得更好的效能與靈活度。

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