java.util.Vector 是線程安全的動態陣列,底層由 Object[] elementData 存儲,支持自動擴容。與 ArrayList 主要區別在於所有公共方法均加 synchronized 關鍵字。
// 指定初始容量,增量為 0(即倍增)
public Vector(int initialCapacity) {
this(initialCapacity, 0);
}
// 指定初始容量與擴容增量
public Vector(int initialCapacity, int capacityIncrement) {
if (initialCapacity < 0) throw new IllegalArgumentException("Illegal Capacity: " + initialCapacity);
this.elementData = new Object[initialCapacity];
this.capacityIncrement = capacityIncrement;
}
capacityIncrement > 0 時每次擴容增加固定量;≤ 0 時採用倍增策略(newCapacity = oldCapacity * 2)。
public synchronized boolean add(E e) {
modCount++;
ensureCapacityHelper(elementCount + 1); // 確保容量
elementData[elementCount++] = e;
return true;
}
private void ensureCapacityHelper(int minCapacity) {
int oldCapacity = elementData.length;
if (minCapacity > oldCapacity) {
Object[] oldData = elementData;
int newCapacity = (capacityIncrement > 0)
? (oldCapacity + capacityIncrement)
: (oldCapacity * 2);
if (newCapacity < minCapacity) newCapacity = minCapacity;
elementData = Arrays.copyOf(elementData, newCapacity);
}
}
關鍵點:
Arrays.copyOf 完成陣列複製與擴容,時間複雜度 O(n)。modCount 用於快速失效迭代器。Vector v = new Vector<>(4);
v.add("Test0"); v.add("Test1"); v.add("Test0"); v.add("Test2"); v.add("Test2");
v.remove("Test0"); // 刪除首個匹配元素
v.remove(0); // 按索引刪除
int size = v.size(); // 當前元素數量
for (int i = 0; i < size; i++) {
System.out.println(v.get(i));
}
ArrayList。System.arraycopy。__construct 配合 func_get_args 模擬。