我想知道何时实例化一个类的ArrayList。如果我通过给它一个初始大小来声明它像#2反对#1那么它会不会更快?或者,如果我确切地知道我将添加多少列,我应该只给构造函数一个初始大小?
List<Column> columns = new ArrayList<Column>();
List<Column> columns = new ArrayList<Column>(10);
答案 0 :(得分:5)
他们认为,两者之间没有区别。
构造函数中的参数用于指定List
的初始容量,默认情况下为10
。
或者,如果我确切地知道要添加多少列,我应该只给构造函数一个初始大小?
通常,如果您要经常在List
中添加太多元素,则可以提供更大的初始容量,以便支持的数组不会重新调整大小太多倍。
好吧,如果你有一个固定的大小,根本不会改变,你可以简单地使用一个数组。
答案 1 :(得分:3)
默认情况下,它会分配10
引用,因此无差异
public ArrayList() {
this(10);
}
它的用法是预测近似数,例如,如果您认为它可能需要大约25个元素并且您认为它也可以增长,那么只需将initialCapacity定义为25
以避免阵列复制,这是更昂贵的操作
答案 2 :(得分:1)
对于这种特殊情况,两种选择都有相同的结果。但是,如果你提出问题,我们是否应该提高标准并将其带到一般案例中:
或者,如果我确切地知道要添加多少列,我应该只给构造函数一个初始大小?
你可以这样做,以避免在添加一个超出列表底层数组边界的元素时发生的大小调整。
检查ArrayList
的代码:
public boolean add(E e) {
ensureCapacity(size + 1); // Increments modCount!!
elementData[size++] = e;
return true;
}
ensureCapacity
是一个方法,如果它实际上是“完整的”,它会调整列表底层数组的大小:
public void ensureCapacity(int minCapacity) {
modCount++;
int oldCapacity = elementData.length;
if (minCapacity > oldCapacity) {
Object oldData[] = elementData;
int newCapacity = (oldCapacity * 3)/2 + 1;
if (newCapacity < minCapacity)
newCapacity = minCapacity;
// minCapacity is usually close to size, so this is a win:
elementData = Arrays.copyOf(elementData, newCapacity);
}
}
设置初始已知容量可防止此调整大小。尽管如此,如果你真的知道你将使用多少元素,为什么不使用数组呢?
答案 3 :(得分:0)
如果您确切知道将放入ArrayList的成员数量,那么提供初始容量(第二种情况)可以避免在列表增长时重新创建和复制基础数组表示。
您的示例使用10个成员,这恰好是ArrayList当前实现的默认大小。但是,我认为你问的是更普遍的情况。