許多 Java 開發者都知道 ArrayList 非同步、Vector 同步,但很少有人深入源碼層面剖析兩者的具體實現差異。本文基於 JDK 6.0_04 源碼,從類聲明、建構子、核心方法、內部欄位、擴充方法五個維度,揭示兩者的真正區別。
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;
兩者繼承體系、實作介面完全相同,均支援隨機存取、複製與序列化。
// 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))。
// ArrayList - 非同步
public boolean add(E e);
// Vector - 同步
public synchronized boolean add(E e);
Vector 所有公有方法(add、get、set、remove 等)均標記 synchronized,確保執行緒安全;ArrayList 則無同步機制,效能較佳但非執行緒安全。
ArrayList: private int size;
Vector: private int elementCount;
語義相同,僅命名風格不同,反映早期設計習慣。
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 介面標準方法。
Collections.synchronizedList(new ArrayList<>()) 或 CopyOnWriteArrayList,而非直接用 VectorelementAt、elements() 等傳統 API,Vector 可減少重構成本總結:Vector 是早期 Java 集合框架的產物,同步機制雖提供便利,但粒度較粗、擴容策略較死板。現代開發中,ArrayList 搭配顯式同步或並發容器,通常能獲得更好的效能與靈活度。