Vector
繼承自AbstractList,實現了List,RandomAccess,Cloneable,和Serializable接口,具有List的特性,提供可隨機訪問,提供自身克隆以及序列化的一個容器類。
特點:線程安全;數組實現
Vector的實現和ArrayList沒什么區別,這里就不列成員變量和一些共有的方法了,有興趣可以去看走進源碼——ArrayList閱讀筆記,這篇主要講Vector和ArrayList的區別
-
區別一:線程安全
在ArrayList中,所有的方法都是線程不安全的,在多線程環境下很容易出問題,而Vector就不一樣了,Vector在涉及到操作容器數據的方法上,都加上了synchronized
關鍵字,甚至是迭代器的獲取上也加上了這個關鍵字,我們可以感受下
帶synchronized關鍵字的獲取迭代器的方法
帶synchronized關鍵字的remove的方法
但是,凡事有利弊,這種線程絕對安全的保證的一個最明顯的負面效應就是性能的損耗,特別是很多線程同時操作同一個Vector對象時,那么將會有很多很多線程被阻塞,是很不利于系統性能的。 區別二:初始化
相對于ArrayList中的初始化,Vector的其中一個初始化函數多了一個
protected int capacityIncrement;
形參,這個形參如其名,容量增長,取好聽點,我們叫容量增長因子。
public Vector(int initialCapacity, int capacityIncrement) {
super();
if (initialCapacity < 0)
throw new IllegalArgumentException("Illegal Capacity: "+
initialCapacity);
this.elementData = new Object[initialCapacity];
this.capacityIncrement = capacityIncrement;
}
類似于ArrayList的帶initialCapacity形參的構造函數,區別就在于初始化自身的capacityIncrement屬性而已,其次還有下面兩個
public Vector(int initialCapacity) {
this(initialCapacity, 0);
}
public Vector() {
this(10);
}
這里吐槽下this(10);
,在ArrayList那里起碼還有一個DEFAULT_CAPACITY
,在Vector這里直接就是10....是懶了嗎...Vector的默認初始化就是容量為10,容量增長因子為0
- 區別三:容量增長
在ArrayList中容量是1.5倍增加的,可能Vector的設計者覺得這個1.5太可怕了(特別在數量級達到萬之后的單位),所以才在vector里增加這個容量增長因子的東西,下面直接上核心代碼
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
,那么,vector的每次容量的增長都是以capacityIncrement
為單位進行增長的,所以就沒有了ArrayList中直接增大1.5倍的爆炸增長速率
其余的實現和ArrayList都是大同小異,這里就不在撰述了