Vector源碼分析(對比ArrayList)

在上篇文章ArrayList源碼淺析中分析了一下 ArrayList的源碼和一些重要方法,如今對比 ArrayList,總結一下 VectorArrayList的不一樣segmentfault

構造方法

其實二者在不少地方都是同樣的,然而在構造方法上面, VectorArrayList多了一個方法: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

Enumeration

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取代。還有IteratorFast-Fail的,但 Enumeration不是,這一點很重要。get

相關文章
相關標籤/搜索