概述
爲何將Vector和ArrayList做比較呢?原因是他們底層都是基於數組的,主要區別是Vector是線程安全的,而ArrayList是非線程安全的。從源碼可以看出Vector大部分方法都加了synchronized關鍵字。
除此之外,他們在初始化與擴容方面也有一些細微的差別。
構造
ArrayList的構造方法:
//構造一個具有指定初始容量的空列表List
public ArrayList(int initialCapacity);
//構造一個初始容量爲10的空列表。
public ArrayList();
//構造一個包含指定 collection 的元素的列表
public ArrayList(Collection<? extends E> c)
Vector的構造與擴容:
//使用指定的初始容量和等於零的容量增量構造一個空向量。
public Vector();
//構造一個空向量,使其內部數據數組的大小,其標準容量增量爲零。
public Vector(int initialCapacity);
//構造一個包含指定 collection 中的元素的向量
public Vector(Collection<? extends E> c);
//使用指定的初始容量和容量增量構造一個空的向量
public Vector(int initialCapacity,int capacityIncrement);
可以看出Vector比ArrayList多了一個構造方法public Vector(int initialCapacity,int capacityIncrement);
其中capacityIncrement參數就是增長因子,通過此構造方法來創建一個Vector時,當容量不足時擴充的容量大小是capacityIncrement。
我們來看下擴充容量的源碼:
private void grow(int minCapacity) {
// overflow-conscious code
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時,擴充後的容量爲oldCapacity +capacityIncrement,否則爲2*oldCapacity ,這裏與ArrayList不同,ArrayList每次擴容大小爲原來容量的50%。
此外我們再來看下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,創建的時候就分配了10個元素的內存。而ArrayList是在第一次add的時候才真正分配的內存。