1、ArrayList的底层实际上是一个Object数组,我们可以看到它的空参构造方法是把Object数组指向了一个长度为0的Object数组。
private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = new Object[0];
transient Object[] elementData;
public ArrayList() {
this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
}
2、此时数组的大小为0,需要第一次添加元素后进行扩容,this.ensureCapacityInternal(this.size + 1);这个方法是用来判断是否需要进行扩容,size是一个int型成员变量,初始时为0,size代表了没有添加前当前数组所含元素的个数,size+1代表如果添加后的元素个数
private int size;
public boolean add(E var1) {
this.ensureCapacityInternal(this.size + 1);
this.elementData[this.size++] = var1;
return true;
}
3、在这里进行了一个if判断,构造方法中是将elementData 指向了DEFAULTCAPACITY_EMPTY_ELEMENTDATA这个的,就是判断是否是第一次扩容,因为扩容之后的数组都会是一个新的地址,第一次扩容大小为10,否则传递的参数为上文中的size+1,即添加后的元素个数
private void ensureCapacityInternal(int var1) {
if (this.elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
var1 = Math.max(10, var1);
}
this.ensureExplicitCapacity(var1);
}
4、这里就是是否需要扩容的判断了,如果传递过来的元素个数大于elementData数组的长度的话就要调用grow方法进行扩容,modCount这里不做详解。
private void ensureExplicitCapacity(int var1) {
++this.modCount;
if (var1 - this.elementData.length > 0) {
this.grow(var1);
}
}
5、var2为数组未添加前长度,var3为扩大1.5倍后的长度,这两个if是用来防止扩容后过大或过小的,第一个if主要是为了第一次扩容的时候使用,最后通过Arrays.copyOf(this.elementData, var3);返回一个包含原先数组元素和原先数组大小1.5倍的数组
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);
}
6、最后返回到add方法中,this.elementData[this.size++] = var1;赋值,因为下标从0开始,所以此处++在右边,后计算。
学艺不精,仅供参考,有错误请指出