List、Serializable、Cloneable
// 初始容量 12,每次擴容增加 12
Vector<Object> v = new Vector<>(12, 12);
v.add(1); v.add(2.34); v.add("abc");
v.capacity(); // 返回當前容量
v.setSize(16); // 強制設置大小,不足補 null,超出截斷
Object[] arr = new Object[v.size()];
v.copyInto(arr); // 僅複製元素,不影響容量
Enumeration<Object> en = v.elements();
while (en.hasMoreElements()) {
System.out.println(en.nextElement());
}
synchronized E firstElement();
synchronized E lastElement();
synchronized void setElementAt(E obj, int index);
synchronized void removeElementAt(int index);
synchronized void insertElementAt(E obj, int index);
synchronized void addElement(E obj);
synchronized boolean removeElement(Object obj);
synchronized void removeAllElements();
Vector<Object> list = new Vector<>();
list.add(1); list.add("abc"); list.add(1.11);
list.add(0, "head"); // 頭部插入
list.add(2, "mid"); // 指定位置插入
list.get(0); // 隨機訪問
list.contains("abc");
list.indexOf("abc");
list.lastIndexOf("abc");
list.remove(1); // 刪除索引 1
list.remove(new Integer(1)); // 刪除元素 1 (注意 int 重載陷阱)
Iterator<Object> it = list.iterator();
while (it.hasNext()) System.out.print(it.next() + " ");
Object[] arr = list.toArray();
// 錯誤示範
List<MyObj> list = new Vector<>();
MyObj obj = new MyObj();
for (int i=1; i<=5; i++) {
obj.setName("Name"+i);
list.add(obj); // 每次添加同一引用!
}
// 結果:[Name5, Name5, Name5, Name5, Name5]
// 正確做法
List<MyObj> list2 = new Vector<>();
for (int i=1; i<=5; i++) {
MyObj obj2 = new MyObj(); // 每次 new 新對象
obj2.setName("Name"+i);
list2.add(obj2);
}
// 結果:[Name1, Name2, Name3, Name4, Name5]
此陷阱與 List 實現無關,ArrayList/LinkedList 同樣會中招。
| 維度 | Vector | ArrayList | 現代最佳實踐 |
|---|---|---|---|
| 線程安全 | 方法級同步 | 非同步 | ConcurrentList / CopyOnWriteArrayList / 外部鎖 |
| 擴容策略 | 可配置增量,預設 2倍 | 1.5倍 | 預估大小指定初始容量 |
| 效能 | 低(同步開銷大) | 高 | 視場景選擇無鎖/細粒度鎖 |
| API 風格 | 保留 Enumeration、ElementAt 等舊式 | 純 List/Collection API | 統一使用 Iterator/Stream |
| 適用場景 | 極舊版本維護 | 單執行緒、非共享 | 多執行緒共享用並發集合 |
CopyOnWriteArrayList(寫入複製數組,讀無鎖,適合讀多寫少)。Collections.synchronizedList(new ArrayList()) + synchronized(list) { ... } 手動加鎖。ConcurrentLinkedDeque、ArrayBlockingQueue 等並發隊列。Vector 是同步版 ArrayList,承載著 JDK 1.0 的歷史包袱。現代 Java 開發中,單執行緒用 ArrayList,多執行緒用並發集合框架,Vector 僅作為遺留系統維護時的認知負擔存在。理解其同步機制、擴容策略與經典陷阱,有助於寫出更健壯、高效的集合代碼。