ArrayList
的默认长度是 10.
new ArrayList
后并没有完成数组的初始化.
调用add()
方法后才完成真正的初始化
private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};
public ArrayList() {
this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
}
可以发现,new ArrayList()
会创建一个空数组.
调用add()
后
public boolean add(E e) {
// 1. 进入该方法
ensureCapacityInternal(size + 1); // Increments modCount!!
elementData[size++] = e;
return true;
}
private void ensureCapacityInternal(int minCapacity) {
// 2. 进入calculateCapacity先计算容量 然后ensureExplicitCapacity()
ensureExplicitCapacity(calculateCapacity(elementData, minCapacity));
}
private static int calculateCapacity(Object[] elementData, int minCapacity) {
// 3. elementData = {} 条件成立
if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
// 4. 这里返回ArrayList的默认长度 10
return Math.max(DEFAULT_CAPACITY, minCapacity);
}
return minCapacity;
}
private void ensureExplicitCapacity(int minCapacity) {
modCount++;
// 5. 经过2.后,minCapacity=10,会触发扩容
if (minCapacity - elementData.length > 0)
grow(minCapacity);
}
执行上诉步骤后,ArrayList
完成了初始化并添加了第一个元素.
Hashmap
也是如此,调用put()
方法才真正完成初始化!