Java Vector类应用场景
作者:程序员水自流
Vector是Java线程安全的动态数组,支持动态扩容与随机访问,所有方法加锁确保并发安全,但性能较低,现代开发推荐用CopyOnWriteArrayList或手动同步的ArrayList替代,本文给大家介绍Java Vector类详解,感兴趣的朋友一起看看吧
Vector 是 Java 中的一个经典集合类,位于 java.util 包中。它是一个 动态数组,允许存储任意类型的对象,并支持动态调整大小。与 ArrayList 类似,但 Vector 的所有方法都是 线程安全的,适用于多线程环境。以下是 Vector 类的详细介绍:
一、Vector的核心特性
1. 动态数组
Vector内部通过数组实现,支持动态扩容和缩容。- 当元素数量超过当前数组容量时,会自动扩容(默认扩容为当前容量的 2 倍)。
- 支持随机访问(通过索引直接获取元素),实现
RandomAccess接口。
2. 线程安全
- 所有方法(如
add、get、remove)都通过synchronized关键字修饰,确保多线程环境下的线程安全。 - 同步锁粒度:对整个
Vector对象加锁,可能导致性能开销较大。
3. 允许重复元素和null值
- 与
ArrayList一样,Vector允许存储重复元素和null值。
4. 序列化支持
- 实现
Serializable接口,支持对象序列化,可以通过流进行读写。
5. 实现的接口
List<E>:提供列表的基本操作(增删查改)。RandomAccess:支持快速随机访问。Cloneable:支持克隆操作。Serializable:支持序列化。
二、Vector的构造函数
| 构造函数 | 描述 |
|---|---|
Vector() | 创建一个空的 Vector,初始容量为 10。 |
Vector(int initialCapacity) | 指定初始容量,无容量增量(capacityIncrement 为 0)。 |
Vector(int initialCapacity, int capacityIncrement) | 指定初始容量和容量增量。每次扩容时,容量增加 capacityIncrement 的值。若 capacityIncrement <= 0,则扩容为当前容量的 2 倍。 |
Vector(Collection<? extends E> c) | 使用指定集合初始化 Vector。 |
示例代码:
// 默认构造函数
Vector<String> vector1 = new Vector<>();
// 指定初始容量
Vector<String> vector2 = new Vector<>(20);
// 指定初始容量和容量增量
Vector<String> vector3 = new Vector<>(10, 5);
// 从集合初始化
Vector<String> vector4 = new Vector<>(Arrays.asList("A", "B", "C"));三、Vector的常用方法
1. 添加元素
add(E e):将元素添加到Vector末尾。addElement(E obj):与add功能相同(Vector 特有的方法)。insertElementAt(E obj, int index):在指定位置插入元素。
Vector<String> vector = new Vector<>();
vector.add("Apple");
vector.addElement("Banana");
vector.insertElementAt("Cherry", 1);
System.out.println(vector); // [Apple, Cherry, Banana]2. 删除元素
remove(int index):删除指定位置的元素。remove(Object o):删除第一次出现的指定元素。removeElement(Object obj):与remove(Object o)功能相同。removeAllElements():清空所有元素。
vector.remove(1); // 删除索引为1的元素
vector.remove("Apple"); // 删除元素"Apple"
vector.removeAllElements(); // 清空Vector3. 获取和修改元素
get(int index):获取指定索引的元素。set(int index, E element):替换指定索引的元素。elementAt(int index):与get功能相同(Vector 特有的方法)。setElementAt(E obj, int index):与set功能相同。
String fruit = vector.get(0); // 获取第一个元素 vector.set(1, "Blueberry"); // 替换第二个元素
4. 容量和大小
size():返回当前元素数量。capacity():返回当前数组的容量。ensureCapacity(int minCapacity):确保容量至少为minCapacity。trimToSize():将数组容量调整为当前元素数量。
System.out.println(vector.size()); // 输出元素数量 System.out.println(vector.capacity()); // 输出当前容量
四、Vector的线程安全机制
1. 同步方法
- 所有方法通过
synchronized关键字修饰,确保同一时刻只有一个线程访问。 - 示例:
public synchronized boolean add(E e) { modCount++; ensureCapacityHelper(elementCount + 1); elementData[elementCount++] = e; return true; }
2. 优点
- 简单易用,无需手动同步。
- 多线程环境下无需额外加锁。
3. 缺点
- 性能开销:每次方法调用都需要获取锁,高并发下性能较低。
- 锁粒度粗:整个
Vector被加锁,即使只操作单个元素,也会阻塞其他线程。
五、Vector的扩容机制
1. 初始容量
- 默认初始容量为 10(若未指定)。
- 可通过构造函数自定义初始容量。
2. 扩容策略
- 默认扩容:若
capacityIncrement <= 0,容量翻倍(newCapacity = oldCapacity * 2)。 - 指定扩容增量:容量增加
capacityIncrement(newCapacity = oldCapacity + capacityIncrement)。
示例:
Vector<Integer> vector = new Vector<>(5, 3); // 初始容量5,增量3
for (int i = 0; i < 10; i++) {
vector.add(i);
}
System.out.println(vector.capacity()); // 输出 11(5 → 5+3=8 → 8+3=11)六、Vector与ArrayList的对比
| 特性 | Vector | ArrayList |
|---|---|---|
| 线程安全 | ✅ 是(方法级同步) | ❌ 否 |
| 性能 | 较低(同步锁开销) | 高 |
| 扩容策略 | 默认扩容为 2 倍 | 扩容为 1.5 倍 |
| 适用场景 | 多线程环境 | 单线程或需手动同步的场景 |
| 替代方案 | CopyOnWriteArrayList、Collections.synchronizedList | — |
七、Vector的使用注意事项
1. 快速失败的迭代器
- 使用
Iterator遍历时,如果在迭代过程中修改Vector(如add、remove),会抛出ConcurrentModificationException。 - 解决方案:使用
Enumeration或在遍历时对Vector加锁。
// 快速失败示例
Vector<String> vector = new Vector<>(Arrays.asList("A", "B", "C"));
for (String s : vector) {
if (s.equals("B")) {
vector.remove(s); // 抛出 ConcurrentModificationException
}
}2. 内存开销
- 扩容可能导致内存浪费(如频繁扩容时)。
- 建议根据业务需求合理设置初始容量和容量增量。
八、Vector的应用场景
1. 推荐使用场景
- 小规模多线程环境(如连接池、缓存)。
- 需要简单线程安全的集合,且性能要求不高。
2. 替代方案
- 高并发场景:使用
CopyOnWriteArrayList(写时复制,读性能高)。 - 单线程场景:使用
ArrayList(性能更高)。 - 需要手动同步:使用
Collections.synchronizedList(new ArrayList<>())。
九、Vector示例代码
import java.util.Vector;
public class VectorExample {
public static void main(String[] args) {
// 创建Vector
Vector<String> vector = new Vector<>(5, 2); // 初始容量5,增量2
// 添加元素
vector.add("Apple");
vector.add("Banana");
vector.insertElementAt("Cherry", 1);
// 遍历Vector
System.out.println("Vector元素: " + vector);
for (String fruit : vector) {
System.out.println(fruit);
}
// 修改元素
vector.set(1, "Blueberry");
// 删除元素
vector.remove("Apple");
// 输出结果
System.out.println("修改后的Vector: " + vector);
}
}十、总结
Vector 是 Java 早期提供的线程安全动态数组,尽管其同步机制简化了多线程开发,但性能开销较大。现代 Java 开发中,推荐使用更高效的线程安全集合类(如CopyOnWriteArrayList)或非线程安全的 ArrayList 并手动同步。理解 Vector 的特性、扩容策略和适用场景,有助于在特定需求下合理选择数据结构。
到此这篇关于【Java第85集】java Vector类详解的文章就介绍到这了,更多相关java Vector类内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
