声明一个ArrayList

时间:2013-07-29 18:49:52

标签: java arraylist

我想知道何时实例化一个类的ArrayList。如果我通过给它一个初始大小来声明它像#2反对#1那么它会不会更快?或者,如果我确切地知道我将添加多少列,我应该只给构造函数一个初始大小?

  1. List<Column> columns = new ArrayList<Column>();
  2. List<Column> columns = new ArrayList<Column>(10);

4 个答案:

答案 0 :(得分:5)

他们认为,两者之间没有区别

构造函数中的参数用于指定List的初始容量,默认情况下为10

  

或者,如果我确切地知道要添加多少列,我应该只给构造函数一个初始大小?

通常,如果您要经常在List中添加太多元素,则可以提供更大的初始容量,以便支持的数组不会重新调整大小太多倍。 好吧,如果你有一个固定的大小,根本不会改变,你可以简单地使用一个数组。

答案 1 :(得分:3)

默认情况下,它会分配10引用,因此无差异

source

见证
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当前实现的默认大小。但是,我认为你问的是更普遍的情况。