Vectorソース分析(ArayListと比較)
前の記事では、ArayListのソースコードの分析では、
作成方法
実際には、両者は多くの場所で同じであるが、構造方法においては、
拡充策
同期
周知のように、
Eumeration
Vectorには、匿名の内部クラスで実施された
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
キーワードを追加したが、これはまた、システムオーバーヘッドを増大させる。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
によって置き換えられている。また、Iterator
はIterator
ですが、Fast-Fail
はそうではないので、この点が重要です。