我想知道当我实例化一个类的 ArrayList 时。如果我通过给它一个初始大小来声明它像#2而不是#1,它会更快吗?或者如果我确切知道要添加多少列,我是否应该只给构造函数一个初始大小?
List<Column> columns = new ArrayList<Column>();
List<Column> columns = new ArrayList<Column>(10);
按照他们的立场,两者之间没有区别。
构造函数中的参数用于指定 的初始容量,List
默认为10
。
或者如果我确切知道要添加多少列,我是否应该只给构造函数一个初始大小?
一般来说,如果要List
频繁添加太多元素,可以给一个更大的初始容量,这样后备数组就不会重新调整大小太多次。好吧,如果你有一个固定的大小,根本不会改变,你可以简单地使用一个数组。
默认情况下它分配10
参考所以没有区别
从源头见证
public ArrayList() {
this(10);
}
它的用途是预测近似数字,例如,如果您认为它可能需要大约 25 个元素并且您认为它也可以增长,那么只需定义 initialCapacity25
以避免数组复制,这是更昂贵的操作
对于这种特殊情况,两个选项具有相同的结果。但是,我们是否应该提高标准并按照您的要求将其带到一般情况下:
或者如果我确切知道要添加多少列,我是否应该只给构造函数一个初始大小?
您可以这样做以避免在添加超出列表基础数组范围的元素时发生的调整大小。
检查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);
}
}
设置初始已知容量可防止这种调整大小。不过,如果您确切知道要使用多少个元素,为什么不使用数组呢?
如果您确切知道要放入 ArrayList 的成员数量,那么提供初始容量(第二种情况)可以避免随着列表的增长而重新创建和复制底层数组表示。
您的示例使用 10 个成员,这恰好是 ArrayList 当前实现的默认大小。但是,我想你问的是更一般的情况。