字段:
size并不代表elementData的长度,代表ArrayList的元素数量
构造:
从无参构造可以看出ArrayList底层走的数组原理,ArrayList的操作都是由elementData来记录
Add操作:
从add方法看出,elementData[size++]才是真正的新增操作,
ensureCapacityInternal(size + 1)实际是为了给elementData数组扩容操作
扩容原理:
扩容之前为了计算出ArrayList的容量
minCapacity代表ArrayList之前的size+1,如果该次新增操作超过了默认值10,取出最大值
modCount记录ArrayList操作次数;
当minCapacity(size+1)大于elementData(默认长度10)数组大小,elementData才会实现扩容操作
第一次新增minCapacity为10,需要将elementData扩容为长度为10,所以说elementData默认长度为10的数组
然而当新增到11个元素的时候实现扩容操作
newCapacity扩容为15,对半扩容
int newCapacity = oldCapacity + (oldCapacity >> 1);
以下是ArrayList新增流程图:
Remove操作
1.rangeCheck校验传入的index是否超出arrayList最大下标
2.arrayList修改次数modCount++
3.取出该次需要删除的元素
4.获取需要移动的个数
5.sysyem.arraycopy数组复制
6.通知jvm将之前的最后一位元素进行垃圾回收
参数解释:
src:源数组
srcPos:源数组复制的起始值
dest:目标数组
destPos:目标数组放值的起始位置
length:源数组需要复制的数量以及目标数组需要放值的数量
addAll操作:
1.将需要新增的集合转为数组
2.ensureCapacityInternal(size + numNew)判断是否需要为elementData扩容操作,扩容流程见上上上上图
3.sysyem.arraycopy方法将新的数组复制到elementData,解释见上图
4.ArrayList元素数量新增