在上篇文章ArrayList源碼淺析中分析了一下 ArrayList
的源碼和一些重要方法,如今對比 ArrayList
,總結一下 Vector
和 ArrayList
的不一樣segmentfault
其實二者在不少地方都是同樣的,然而在構造方法上面, Vector
比 ArrayList
多了一個方法:this
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
中沒有 capacityIncrement
這個變量, vector
的這個構造方法,不只可以指定初始化容量,還能指定當容量不夠時,容量自增的大小。下面看擴容方法.code
在 ArrayList
中,擴容的時候通常都是增長0.5倍左右,而在 Vector
中,若是指定了這個 capacityIncrement
,就會在原來容量的基礎上增長 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); }
除了這一點,其它和 ArrayList
如出一轍。ci
衆所周知, Vector
是同步的而 ArrayList
不是, Vector
在一些必要的方法上都加了 synchronized
關鍵字,可是這也會加大系統開銷。element
Vector中有一個 elements()
方法用來返回一個 Enumeration
,以匿名內部類的方式實現的:rem
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"); } }; }
Enumeration
接口和 Iterator
相似,都用做於對集合進行迭代,不過沒有刪除功能,已經被 Iterator
取代。還有Iterator
是 Fast-Fail
的,但 Enumeration
不是,這一點很重要。get