hello啊,各位观众姥爷们!!!本baby今天来报道了!哈哈哈哈哈嗝
ArrayList 和 Vector 都是 Java 中基于动态数组实现的 List
接口的实现类,但它们在设计、性能和线程安全性上有显著差异。以下是两者的核心区别:
特性 | ArrayList | Vector |
---|---|---|
线程安全 | 非线程安全(方法未同步) | 线程安全(方法通过 synchronized 同步) |
适用场景 | 单线程环境,性能优先 | 多线程环境(但实际开发中不推荐) |
示例对比:
// ArrayList(非线程安全)
List<String> arrayList = new ArrayList<>();
arrayList.add("A"); // 多线程并发 add() 可能导致数据覆盖或异常
// Vector(线程安全)
List<String> vector = new Vector<>();
vector.add("A"); // 内部使用 synchronized 同步,保证线程安全
特性 | ArrayList | Vector |
---|---|---|
默认容量 | 10 | 10 |
扩容公式 | 1.5 倍(newCapacity = oldCapacity + (oldCapacity >> 1) ) |
2 倍(newCapacity = oldCapacity * 2 ) |
性能影响 | 内存利用率较高,但扩容次数可能较多 | 扩容次数较少,但内存浪费较多 |
代码示例:
// ArrayList 扩容逻辑
int newCapacity = oldCapacity + (oldCapacity >> 1);
// Vector 扩容逻辑(可自定义增长因子)
int newCapacity = oldCapacity + ((capacityIncrement > 0) ? capacityIncrement : oldCapacity);
操作 | ArrayList | Vector |
---|---|---|
单线程读写 | 更快(无同步开销) | 较慢(同步方法导致性能损耗) |
多线程读写 | 需手动同步(如使用 Collections.synchronizedList ) |
自动同步,但锁竞争可能成为瓶颈 |
基准测试示例(单线程添加 100 万元素):
// ArrayList 耗时 ≈ 50ms
List<Integer> list = new ArrayList<>();
for (int i = 0; i < 1_000_000; i++) {
list.add(i);
}
// Vector 耗时 ≈ 150ms(因同步开销)
List<Integer> vector = new Vector<>();
for (int i = 0; i < 1_000_000; i++) {
vector.add(i);
}
特性 | ArrayList | Vector |
---|---|---|
引入版本 | JDK 1.2(集合框架的一部分) | JDK 1.0(遗留类) |
设计目标 | 替代 Vector,优化单线程性能 | 早期多线程支持 |
方法扩展 | 支持现代集合操作(如 forEach ) |
保留旧方法(如 addElement ) |
特性 | ArrayList | Vector |
---|---|---|
迭代器 | 快速失败(Fail-Fast) | 快速失败(Fail-Fast) |
同步要求 | 多线程迭代需手动同步 | 自动同步(但迭代仍需外部同步) |
示例:
// ArrayList 迭代需手动同步
List<String> list = Collections.synchronizedList(new ArrayList<>());
synchronized (list) {
Iterator<String> it = list.iterator();
while (it.hasNext()) {
System.out.println(it.next());
}
}
// Vector 迭代仍需同步(避免 ConcurrentModificationException)
Vector<String> vector = new Vector<>();
synchronized (vector) {
Iterator<String> it = vector.iterator();
while (it.hasNext()) {
System.out.println(it.next());
}
}
Collections.synchronizedList(new ArrayList<>())
(灵活控制同步范围)。CopyOnWriteArrayList
(读多写少场景)。java.util.concurrent
)提供更高效的线程安全类。// 方案1:使用同步包装类
List<String> syncList = Collections.synchronizedList(new ArrayList<>());
// 方案2:使用并发集合类
CopyOnWriteArrayList<String> cowList = new CopyOnWriteArrayList<>();
结论:ArrayList 是更现代、更高效的选择,Vector 仅用于兼容旧代码或特定场景的简单多线程需求。