请注意,它不是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);
}
答案 0 :(得分:7)
这是一种优化。开发人员决定使用空的后备数组初始化ArrayList
,并仅在开始向List
中添加元素时才懒惰地创建非空的后备数组。
添加第一个元素(通过调用add
)时,它将调用
ensureCapacityInternal(size + 1);
检查是否为elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA
,如果是,则将容量设置为
minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity);
DEFAULT_CAPACITY
是10
。
答案 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);
}