Vector原始碼分析

木叔發表於2016-11-04
在之前文章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。因此,編寫依賴於此異常的程式的做法是錯誤的,正確做法是:迭代器的快速失敗行為應該僅用於檢測程式錯誤。
 

相關文章