Vectorソース分析(ArayListと比較)


前の記事では、ArayListのソースコードの分析では、ArrayListのソースコードといくつかの重要な方法を分析し、現在はArrayListを比較して、VectorArrayListの違いを要約します。
作成方法
実際には、両者は多くの場所で同じであるが、構造方法においては、VectorArrayListよりも多くの方法を有している。
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キーワードを追加したが、これはまた、システムオーバーヘッドを増大させる。
Eumeration
Vectorには、匿名の内部クラスで実施されたelements()に戻るための方法がある。
 public Enumeration elements() {
        return new Enumeration() {
            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インターフェースおよびEnumerationは、同じように、セットを反復するために使用されているが、削除機能はなく、Iteratorによって置き換えられている。また、IteratorIteratorですが、Fast-Failはそうではないので、この点が重要です。