はい、ArrayList
この場合、コンストラクターに容量を渡す必要があります。理由は次のとおりです。
呼び出すコンストラクタは次のとおりです。
public ArrayList(int initialCapacity) {
super();
if (initialCapacity < 0)
throw new IllegalArgumentException("Illegal Capacity: "+
initialCapacity);
this.elementData = new Object[initialCapacity];
}
を渡すことinitialCapacity
で、 をサポートする配列のサイズを設定していますArrayList
。
リストに追加しようとすると、その要素によってリストのサイズが変更されるとします。実行される一連の関数呼び出しは次のとおりです。
public boolean add(E e) {
ensureCapacityInternal(size + 1); // Increments modCount!!
elementData[size++] = e;
return true;
}
private void ensureCapacityInternal(int minCapacity) {
if (elementData == EMPTY_ELEMENTDATA) {
minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity);
}
ensureExplicitCapacity(minCapacity);
}
private void ensureExplicitCapacity(int minCapacity) {
modCount++;
// overflow-conscious code
if (minCapacity - elementData.length > 0)
grow(minCapacity);
}
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);
}
結論として、最終的なサイズがわかっている場合は、それをコンストラクターに渡すことで、配列のサイズを変更する必要がないことを保証できます。
最終的な容量が十分に大きく、ArrayList
比較的長期間使用されない場合は、それほど多くのメモリを割り当てたくない場合があります。つまり、必要に応じてサイズを変更する方がよい場合があります。それ以外の場合は、初期容量を渡します。