Vector介绍
Vector与ArrayList一样,都实现了可变数组,都集成继承 AbstractList 类,实现了List接口,RandomAccess接口,Cloneable接口和Serializable接口。因此功能上基本与ArrayList差不多,同时都支持快速随机访问。
Vector与ArrayLsit的区别
1. 构造函数不同
构造函数:
public Vector() {
this(10);
}
public Vector(int initialCapacity) {
this(initialCapacity, 0);
}
public Vector(int initialCapacity, int capacityIncrement) {
super();
if (initialCapacity < 0)
throw new IllegalArgumentException("Illegal Capacity: "+
initialCapacity);
this.elementData = new Object[initialCapacity];
this.capacityIncrement = capacityIncrement;
}
- Vector的空参构造函数会在一开始就初始化数组的长度为10,而ArrayList只是指定一个空的数组,在之后加入元素之后才会确定容量,有可能会是10。可以看[另一篇ArrayList的介绍]。(http://blog.csdn.net/lightofmiracle/article/details/72843332)
- Vector可以指定容量增长的参数。
2. 容量的增长不同
private void grow(int minCapacity) {
// overflow-conscious code
int oldCapacity = elementData.length;
//如果没有指定容量则为原来的2倍
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);
}
Vector如果没有指定容量则为原来的2倍,而ArrayList是1.5倍:
int newCapacity = oldCapacity + (oldCapacity >> 1);
3. Vector是线程安全的
Vector中的很多方法都用synchronized同步,因此是线程安全的
4. Vector特有的方法elements()
public Enumeration<E> elements() {
return new Enumeration<E>() {
int count = 0;
public boolean hasMoreElements() {
return count < elementCount;
}
public E nextElement() {
synchronized (Vector.this) {
if (count < elementCount) {
return elementData(count++);
}
}
throw new NoSuchElementException("Vector Enumeration");
}
};
}
与Iterator基本相同,返回一个枚举,也用于遍历,但是没有remove功能,同时由于名字很长现在被Iterator代替。