1.通过ArrayList的无参构造创建出一个初始长度为0的数组
//源码中的ArrayList 无参构造方法
public ArrayList() {
this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
}
//源码解析为创建出一个初始长度为0的Object数组
private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = new Object[0];
2.通过ArrayList的带参构造创建对象
public ArrayList(int var1) {
//对传入的参数进行判断 大于0 直接创建一个var1长度的数组
if (var1 > 0) {
this.elementData = new Object[var1];
} else {
//else 后抛出异常
if (var1 != 0) {
throw new IllegalArgumentException("Illegal Capacity: " + var1);
}
this.elementData = EMPTY_ELEMENTDATA;
}
}
//长度为0的Object对象数组
private static final Object[] EMPTY_ELEMENTDATA = new Object[0];
3.ArrayList的add方法解析 每次扩容长度是上次长度的1.5倍
//ArrayList add 方法解析
public boolean add(E var1) {
//判断当前数组是否需要扩容
this.ensureCapacityInternal(this.size + 1);
//将数据存入数组
this.elementData[this.size++] = var1;
return true;
}
private void ensureCapacityInternal(int var1) {
this.ensureExplicitCapacity(calculateCapacity(this.elementData, var1));
}
private void ensureExplicitCapacity(int var1) {
++this.modCount;
if (var1 - this.elementData.length > 0) {
this.grow(var1);
}
}
//通过右移运算进行扩容
private void grow(int var1) {
int var2 = this.elementData.length;
int var3 = var2 + (var2 >> 1);
if (var3 - var1 < 0) {
var3 = var1;
}
if (var3 - 2147483639 > 0) {
var3 = hugeCapacity(var1);
}
this.elementData = Arrays.copyOf(this.elementData, var3);
}