ArrayList公共构造函数-“构造初始容量为10的空列表”-在哪里?

时间:2018-12-13 13:47:02

标签: java arraylist

请注意,它不是Why start an ArrayList with an initial capacity?

的副本。

从至少Java 1.8开始,研究java.util.ArrayList类的源代码,我看到以下代码:

/**
 * Constructs an empty list with an initial capacity of ten.
 */
public ArrayList() {
    this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
}

哪里

private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};

尽管javadoc正式声明:

  

构造一个初始容量为10的空列表。

我概述: ...初始容量为10 。这十个在哪里?

我完全生气并丢失了一些东西,还是这里仅仅是一个javadoc错误?

UPD:看起来像以前的Java 1.8:

public ArrayList(int initialCapacity) {
    super();
    if (initialCapacity < 0)
        throw new IllegalArgumentException("Illegal Capacity: "+
                                           initialCapacity);
    this.elementData = new Object[initialCapacity];
}

/**
 * Constructs an empty list with an initial capacity of ten.
 */
public ArrayList() {
    this(10);
}

2 个答案:

答案 0 :(得分:7)

这是一种优化。开发人员决定使用空的后备数组初始化ArrayList,并仅在开始向List中添加元素时才懒惰地创建非空的后备数组。

添加第一个元素(通过调用add)时,它将调用

ensureCapacityInternal(size + 1);

检查是否为elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA,如果是,则将容量设置为

minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity);

DEFAULT_CAPACITY10

答案 1 :(得分:3)

第一次将元素添加到列表时,容量将设置为10。

看到这个:

/**
 * Default initial capacity.
 */
private static final int DEFAULT_CAPACITY = 10;

完成过程

步骤1:

public boolean add(E e) {
    modCount++;
    add(e, elementData, size);
    return true;
}

第2步:

private void add(E e, Object[] elementData, int s) {
    if (s == elementData.length)
        elementData = grow();
    elementData[s] = e;
    size = s + 1;
}

第3步,列表grows

private Object[] grow() {
    return grow(size + 1); // size is 0 here
}

private Object[] grow(int minCapacity) {
    return elementData = Arrays.copyOf(elementData,
                                       newCapacity(minCapacity));  // newCapacity(1) will return 10, see step 4, the elementData will have capacity 10.
}

第4步,致电newCapacity(1)

private int newCapacity(int minCapacity) {
    // overflow-conscious code
    int oldCapacity = elementData.length;
    int newCapacity = oldCapacity + (oldCapacity >> 1);
    if (newCapacity - minCapacity <= 0) {
        if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA)
            return Math.max(DEFAULT_CAPACITY, minCapacity);   // will  return 10 here !!!!
        if (minCapacity < 0) // overflow
            throw new OutOfMemoryError();
        return minCapacity;
    }
    return (newCapacity - MAX_ARRAY_SIZE <= 0)
        ? newCapacity
        : hugeCapacity(minCapacity);
}