抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

前言

VectorJava 早期提供的线程安全的动态数组实现,位于 java.util 包中。尽管在现代 Java 开发中,Vector 因性能问题逐渐被 ArrayList 取代,但了解其实现原理仍然有助于理解 Java 集合框架的演变和线程安全机制。

由于 Vector 的底层实现以及结构与 ArrayList 基本相同,所以着重分析 Vector 的特性。

线程安全性

Vector 是一个基于数组的可动态扩展的列表,类似于 ArrayList,但它的所有关于线程安全的方法都被 synchronized 关键字修饰,因此是线程安全的。它支持随机访问元素,并且可以自动扩容以适应更多元素。

扩容机制

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
private void ensureCapacityHelper(int minCapacity) {
if (minCapacity - elementData.length > 0)
grow(minCapacity);
}

private void grow(int minCapacity) {
int oldCapacity = elementData.length;
int newCapacity = oldCapacity + ((capacityIncrement > 0) ?
capacityIncrement : oldCapacity);
if (newCapacity - minCapacity < 0)
newCapacity = minCapacity;
if (newCapacity - MAX_ARRAY_SIZE > 0)
newCapacity = hugeCapacity(minCapacity);
elementData = Arrays.copyOf(elementData, newCapacity);
}

扩容策略

  • 如果 capacityIncrement > 0,则新容量 = 旧容量 + capacityIncrement
  • 如果 capacityIncrement <= 0(默认情况),则新容量 = 旧容量 * 2(翻倍)

ArrayList 的扩容策略为扩大为原来的 1.5 倍。

后记

由于 synchronized 锁粒度过大,每次操作需要加锁,影响并发性能,Vector 也渐渐被弃用。

评论