1. 程式人生 > >JDK原始碼閱讀——Vector實現

JDK原始碼閱讀——Vector實現

1 繼承結構圖

Vector同樣繼承自AbstractList,與ArrayList、LinedList一樣,是List的一種實現

2 資料結構

    // 與ArrayList一樣,也是使用物件陣列儲存元素
    protected Object[] elementData;

    // 記錄元素的個數
    protected int elementCount;

    // 每次動態擴容時陣列長度增長的長度,可在初始化的時候設定
    protected int capacityIncrement;

與ArrayList一樣,Vector也是使用物件陣列記錄元素的值,記錄陣列長度使用elementCount,與ArrayList不一樣的是,Vector每次陣列擴容的長度可在初始化的時候設定,用變數capacityIncrement記錄

3 構造方法

    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); } public Vector(Collection<? extends E> c) { elementData = c.toArray(); elementCount = elementData.length;
// c.toArray might (incorrectly) not return Object[] (see 6260652) if (elementData.getClass() != Object[].class) elementData = Arrays.copyOf(elementData, elementCount, Object[].class); }

如上有四種構造方法,支援無參構造,設定初始長度構造、初始長度和擴容增長長度構造和傳入一個Collection物件進行構造。

其餘三種構造方法與ArrayList基本一樣,只是與ArrayList不一樣的是,Vector支援在構造的時候設定每次動態擴容陣列長度增長的值,而ArrayList預設每次擴容都是在當前陣列長度的基礎上增加一般,具體實現如下:

    private void grow(int minCapacity) {
        // overflow-conscious code
        int oldCapacity = elementData.length;
        int newCapacity = oldCapacity + (oldCapacity >> 1);
        if (newCapacity - minCapacity < 0)
            newCapacity = minCapacity;
        if (newCapacity - MAX_ARRAY_SIZE > 0)
            newCapacity = hugeCapacity(minCapacity);
        // minCapacity is usually close to size, so this is a win:
        elementData = Arrays.copyOf(elementData, newCapacity);
    }

而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);
    }

 

4 需要注意的方法

Vector作為List的一種實現,由於其與ArrayList一樣使用物件陣列來儲存元素,所以其提供的方法與ArrayList基本類似,但是所有方法的定義都多了一個關鍵字synchronized,相信大家已經知道Vector存在的意義了,那麼就是Vector是執行緒安全的。這也是它與ArrayList的根本區別。

這也決定了ArrayList和Vector在使用上的區別。由於ArrayList不考慮執行緒安全,所以在執行效率上,ArrayList是優於Vector的,所以在不需要考慮執行緒安全,或者永遠都只會有一個執行緒能訪問到List物件時,最好使用ArrayList,而在可能會有多個線層訪問同一個List集合時,使用Vector無疑是最佳選擇,因為它的實現已經考慮了執行緒安全的問題。