[译]Java ArrayList 与 Vector

线程同步与线程安全

Vector 是线程同步的,而ArrayList不是;

线程同步和线程安全意味着同一时间只允许一个线程访问数据;

Vector 类中的所有方法都是线程同步的,这就解析了为什么创建Vector 对象时就属于线程同步的了。

性能对比

就两者相比较,Vector 属于线程同步的,其性能相对低,而ArrayList 相对较快,因为ArrayList 允许两个或多个线程同时访问数据,而Vector 则限制同一时间只允许一个线程访问数据。

自动增长容量

Vector 默认按当前大小的两倍增长,而ArrayList 是按50%长度增长,当你往Arraylist 中插入元素(当填满元素)

Arraylist 的默认大小为10,Arraylist 会检查是否到了最后一个元素,然后会创建新的数组,复制原数组的数据到新数组,原数组由jvm回收。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//ArrayList源码
/**
* Default initial capacity.
*/
private static final int DEFAULT_CAPACITY = 10;


//Vector源码
/**
* Constructs an empty vector so that its internal data array
* has size {@code 10} and its standard capacity increment is
* zero.
*/
public Vector() {
this(10);
}

设定增长大小

ArrayList 不能指定增长长度,而Vector 可以指定增长长度,你可以通过Vector 类的下面方法指定增长长度

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
public synchronized void setSize(int i) {
//some code
}

//来自源码
/**
* Sets the size of this vector. If the new size is greater than the
* current size, new {@code null} items are added to the end of
* the vector. If the new size is less than the current size, all
* components at index {@code newSize} and greater are discarded.
*
* @param newSize the new size of this vector
* @throws ArrayIndexOutOfBoundsException if the new size is negative
*/
public synchronized void setSize(int newSize) {
modCount++;
if (newSize > elementCount) {
ensureCapacityHelper(newSize);
} else {
for (int i = newSize ; i < elementCount ; i++) {
elementData[i] = null;
}
}
elementCount = newSize;
}

枚举

除了HashTable,Vector 是同时使用了枚举和迭代的唯一一个类,而ArrayList 只能用迭代器遍历一个ArrayList 对象。

官方定义

java.util.Vector自jdk1.0就出现了,java.util.ArrayList在jdk1.2中被作为Java 集合框架介绍过;在jdk1.2版本,Vector 类已经被重构实现List 接口。

reference: