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

Java 進階教程:Vector 同步列表特性與現代替代方案

     編輯:Java 相關知識

Vector 核心定位

  • JDK 1.0 遺留類,實現 List、Serializable、Cloneable
  • 特點:所有公共方法同步(線程安全)、預設容量 10、擴容 2 倍
  • 與 ArrayList API 幾乎一致,差異在於同步與擴容策略可配置
  • 現代開發強烈建議用 ArrayList + 外部同步或 Concurrent 集合替代

Vector 獨有特性

可配置擴容增量


// 初始容量 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 遍歷(舊式)


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();

通用 List 操作(與 ArrayList 一致)


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 vs ArrayList vs 現代方案

維度VectorArrayList現代最佳實踐
線程安全方法級同步非同步ConcurrentList / CopyOnWriteArrayList / 外部鎖
擴容策略可配置增量,預設 2倍1.5倍預估大小指定初始容量
效能低(同步開銷大)高視場景選擇無鎖/細粒度鎖
API 風格保留 Enumeration、ElementAt 等舊式純 List/Collection API統一使用 Iterator/Stream
適用場景極舊版本維護單執行緒、非共享多執行緒共享用並發集合

多執行緒場景替代方案選型

  1. 高並發讀寫:CopyOnWriteArrayList(寫入複製數組,讀無鎖,適合讀多寫少)。
  2. 需複合操作原子性:Collections.synchronizedList(new ArrayList()) + synchronized(list) { ... } 手動加鎖。
  3. 隊列/棧語義:ConcurrentLinkedDeque、ArrayBlockingQueue 等並發隊列。
  4. 避免直接用 Vector:粗粒度同步導致嚴重爭用,複合操作仍需額外加鎖。

總結

Vector 是同步版 ArrayList,承載著 JDK 1.0 的歷史包袱。現代 Java 開發中,單執行緒用 ArrayList,多執行緒用並發集合框架,Vector 僅作為遺留系統維護時的認知負擔存在。理解其同步機制、擴容策略與經典陷阱,有助於寫出更健壯、高效的集合代碼。

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