在之前文章ArrayList原始碼解析(http://www.cnblogs.com/leskang/p/6019887.html)中分析了一下 ArrayList的原始碼和一些重要方法,現在對比 ArrayList,總結一下 Vector和 ArrayList的不同
構造方法
其實兩者在很多地方都是一樣的,然而在構造方法上面, Vector比 ArrayList多了一個方法:
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的這個構造方法,不僅能夠指定初始化容量,還能指定當容量不夠時,容量自增的大小。下面看擴容方法.
擴容策略
在 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一模一樣。
同步
眾所周知, Vector是同步的而 ArrayList不是, Vector在一些必要的方法上都加了 synchronized關鍵字,但是這也會加大系統開銷。
Enumeration
Vector中有一個 elements()方法用來返回一個 Enumeration,以匿名內部類的方式實現的:
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取代。還有Iterator 是 Fast-Fail(快速失效)的,但 Enumeration不是,這一點很重要。
Fast-Fail快速失效機制儘早丟擲錯誤對程式來說提高了程式的反應速率
fail-fast
“快速失敗”也就是fail-fast,它是Java集合的一種錯誤檢測機制。當多個執行緒對集合進行結構上的改變的操作時,有可能會產生fail-fast機制。記住是有可能,而不是一定。例如:假設存在兩個執行緒(執行緒1、執行緒2),執行緒1通過Iterator在遍歷集合A中的元素,在某個時候執行緒2修改了集合A的結構(是結構上面的修改,而不是簡單的修改集合元素的內容),那麼這個時候程式就會丟擲 ConcurrentModificationException 異常,從而產生fail-fast機制。
注意,迭代器的快速失敗行為不能得到保證,一般來說,存在非同步的併發修改時,不可能作出任何堅決的保證。快速失敗迭代器盡最大努力丟擲 ConcurrentModificationException。因此,編寫依賴於此異常的程式的做法是錯誤的,正確做法是:迭代器的快速失敗行為應該僅用於檢測程式錯誤。