1. 简介
Vector 类是 Java 中一个线程安全的可扩展对象数组实现。它实现了 java.util.List 接口,属于 Java 集合框架 的一部分。虽然它与 ArrayList 相似,但两者在实现上存在显著差异。
本文将深入探讨 Vector 类的核心机制、常用操作方法及适用场景。
2. Vector 工作原理
Vector 本质是一个动态数组,能根据应用需求自动扩容或缩容。因此我们可以通过索引访问其元素,且 它保持插入顺序并允许存储重复元素。
每个 Vector 通过维护两个关键参数优化存储管理:
- capacity(容量):当前 Vector 的最大容量
- capacityIncrement(容量增量):扩容时的增量值
⚠️ 容量始终 ≥ Vector 的实际大小(size)
当元素数量达到容量上限时,新容量按以下规则计算:
newLength = capacityIncrement == 0 ? currentSize * 2 : currentSize + capacityIncrement
与 ArrayList 类似,Vector 的迭代器也是 fail-fast 机制:
- ❌ 遍历过程中直接修改 Vector 会抛出 ConcurrentModificationException
- ✅ 但可通过迭代器的 add() 或 remove() 方法安全修改元素
3. Vector 使用指南
3.1. 创建 Vector
提供四种构造方式:
默认构造器:创建初始容量为 10、容量增量为 0 的空 Vector
Vector<T> vector = new Vector<T>();
指定容量:创建指定初始容量(容量增量仍为 0)
Vector<T> vector = new Vector<T>(int size);
指定容量和增量:完全自定义初始参数
Vector<T> vector = new Vector<T>(int size, int capacityIncrement);
从集合创建:包含指定 Collection 所有元素
Vector<T> vector = new Vector(Collection<T> collection);
3.2. 添加元素
先准备一个基础方法:
Vector<String> getVector() {
Vector<String> vector = new Vector<String>();
vector.add("Today");
vector.add("is");
vector.add("a");
vector.add("great");
vector.add("day!");
return vector;
}
💡 add() 方法支持两种重载形式:
- 末尾追加:
add(E element)
- 指定位置插入:
add(int index, E element)
在指定位置插入元素:
vector.add(2, "not"); // 在索引2插入"not"
assertEquals("not", vector.get(2)); // 结果:[Today, is, not, a, great, day!]
⚠️ 插入操作会导致后续元素整体右移
批量添加集合元素:
ArrayList<String> words = new ArrayList<>(Arrays.asList("Baeldung", "is", "cool!"));
vector.addAll(words);
assertEquals(9, vector.size());
assertEquals("cool!", vector.get(8));
最终结果:
[Today, is, not, a, great, day!, Baeldung, is, cool!]
3.3. 更新元素
使用 set() 方法替换指定位置元素:
Vector<String> vector = getVector();
assertEquals(5, vector.size());
vector.set(3, "good"); // 将索引3替换为"good"
assertEquals("good", vector.get(3));
3.4. 删除元素
remove() 方法提供多种重载形式:
删除指定元素(首次出现):
Vector<String> vector = getVector();
assertEquals(5, vector.size());
vector.remove("a"); // 删除元素"a"
assertEquals(4, vector.size()); // 结果:[Today, is, great, day!]
删除指定位置元素:
vector.remove(2); // 删除索引2的元素"great"
assertEquals("day!", vector.get(2));
⚠️ 删除操作会导致后续元素整体左移 ❌ 超出范围的索引会抛出 ArrayIndexOutOfBoundsException
清空所有元素:
vector.removeAll();
assertEquals(0, vector.size());
3.5. 获取元素
通过 get() 方法访问指定位置元素:
Vector<String> vector = getVector();
String fourthElement = vector.get(3);
assertEquals("great", fourthElement);
❌ 越界访问同样抛出 ArrayIndexOutOfBoundsException
3.6. 遍历 Vector
方式一:for-each 循环(最常用)
Vector<String> vector = getVector();
for(String string : vector) {
System.out.println(string);
}
方式二:forEach() 方法(适合执行特定操作)
Vector<String> vector = getVector();
vector.forEach(System.out::println);
4. Vector 适用场景
优先考虑 Vector 的两种典型场景:
动态扩容需求明确时
- 当集合大小不确定,但能预估元素增删频率
- 可通过设置合理的 capacityIncrement 优化性能
多线程环境
- ✅ 内置同步机制,天然线程安全
- ❌ 单线程环境下性能不如 ArrayList
- 💡 替代方案:使用 ArrayList + Collections.synchronizedList()
📌 性能对比:单线程中 ArrayList 比 Vector 快约 20-30%
5. 总结
本文系统解析了 Java Vector 类的核心机制与实践操作,包括:
- 动态扩容原理
- 增删改查全操作
- 线程安全特性
- 适用场景分析
完整示例代码可在 GitHub 获取。