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() 方法支持两种重载形式:

  1. 末尾追加:add(E element)
  2. 指定位置插入: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 的两种典型场景:

  1. 动态扩容需求明确时

    • 当集合大小不确定,但能预估元素增删频率
    • 可通过设置合理的 capacityIncrement 优化性能
  2. 多线程环境

    • ✅ 内置同步机制,天然线程安全
    • ❌ 单线程环境下性能不如 ArrayList
    • 💡 替代方案:使用 ArrayList + Collections.synchronizedList()

📌 性能对比:单线程中 ArrayListVector 快约 20-30%

5. 总结

本文系统解析了 Java Vector 类的核心机制与实践操作,包括:

  • 动态扩容原理
  • 增删改查全操作
  • 线程安全特性
  • 适用场景分析

完整示例代码可在 GitHub 获取。


原始标题:Intro to Vector Class in Java