Vector
和ArrayList
都是Java
语言中用于存储动态数组的类,它们都实现了List
接口。尽管它们非常相似,但在某些方面存在一些关键的区别:
1. 同步性
Vector
是同步的,也就是线程安全的。这意味着任何时刻只有一个线程能够访问Vector
的实例,这适合在多线程环境中使用。
ArrayList
不是同步的,也就是非线程安全的。它比Vector
更适用于单线程环境,因为它的操作更快。
2. 性能:
由于Vector
是同步的,它在添加、删除和检查元素等操作上通常比ArrayList慢,因为同步带来了额外的性能开销。
ArrayList
由于不需要考虑线程同步,通常在执行这些操作时比Vector
快。
3. 扩展
Vector
默认情况下会扩展其容量的100%,而ArrayList默认情况下会扩展其容量的50%。这意味着在大量数据操作时,ArrayList
可能会更加节省内存。
4.迭代
Vector
使用Enumerator
进行迭代,而ArrayList
使用Iterator
。Iterator
允许在迭代过程中删除元素,而Enumerator
则不允许。
5. 构造函数
ArrayList构造函数
:
public ArrayList(int initialCapacity) {
if (initialCapacity > 0) {
this.elementData = new Object[initialCapacity];
//大于0则直接创建数组
} else if (initialCapacity == 0) {
this.elementData = EMPTY_ELEMENTDATA;
//创建一个空数组
} else {
throw new IllegalArgumentException("Illegal Capacity: "+
initialCapacity);
//小于0则抛出异常
}
}
public ArrayList() {
this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
//创建一个空数组
}
可以看到无参构造创建了一个空数组复制给了elementData
,这个在后续add()
方法才会创建数组。而有参构造就直接创建了数组赋值给elementData
.具体可以看ArrayList源码分析这篇文章。
Vector
构造函数
public Vector(int initialCapacity, int capacityIncrement) {
super();
if (initialCapacity < 0)
throw new IllegalArgumentException("Illegal Capacity: "+
initialCapacity);
this.elementData = new Object[initialCapacity];
this.capacityIncrement = capacityIncrement;
}
public Vector(int initialCapacity) {
this(initialCapacity, 0);
}
public Vector() {
this(10);
}
可以看到Vector
无论用有参构造还是无参构造,在创建的时候就已经创建了好了数组。