在ArrayList中,起始化方式有两种:
1.调用无参的构造方法:
public ArrayList() {
//无参构造方法
this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
//将ArrayList起始化为一个名叫DEFAULTCAPACITY_EMPTY_ELEMENTDATA的对象
}
↓ 我们找到DEFAULTCAPACITY_EMPTY_ELEMENTDATA
private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {
};
// 其实就是创建了一个名为DEFAULTCAPACITY_EMPTY_ELEMENTDATA的Object[]
// 注意:为内容为{},可以理解为长度为0,但不是NUll;
2.调用有参的构造方法:
public ArrayList(int initialCapacity) {
//有参构造方法
if (initialCapacity > 0) {
//如果传入的参数大于0
this.elementData = new Object[initialCapacity];
//按照传入的参数起始化创建一个相应长度的Object[]
} else if (initialCapacity == 0) {
//如果传入的参数等于0
this.elementData = EMPTY_ELEMENTDATA;
//起始化创建一个长度为0的Object[],等同与无参构造
} else {
//如果传入的参数等于0
throw new IllegalArgumentException("Illegal Capacity: "+
initialCapacity);
//抛一个名为非法参数异常
}
}
在明白了构造之后,我们来看看扩容。
首先扩容机制会在调用add方法添加元素时才会触发,我们阅读源码,会发现,扩容机制分为下列阶段:
- add(E e)
- ensureCapacityInternal(int minCapacity)
- ensureExplicitCapacity(int minCapacity)
- gr