ArrayList集合解析(1.8版本)
ArrayList的底层数据结构是动态数组。
特点是,容量可以改变,可以通过索引获取数据,数据存入顺序为有序
初始容量
ArrayList的初始容量为0
一开始通过无参构造创建ArrayList时,会创建容量为0的Object数组,

图中elementData是一个引用类型为Object数组的成员变量,右边是一个空数组。
DEFAULTCAPACITY_EMPTY_ELEMENTDATA也是一个成员属性
那ArrayList是什么时候有才开始有容量的呢?
答案是第一次使用add方法存入数据的时候
首先进入add方法

size参数表示当前数组里有几个元素,+1表示增加最小容量
进入ensureCapacityInternal方法

然后在进入calculateCapacity

第一次初始化就在这里了,它会先判断当前数组的地址是不是等于空数组的地址,如果为true
会进行容量的大小比较返回最大的那个值,DEFAULT_CAPACITY是成员常量,是一个int 类型,值为10。因为是第一次比较,10一定比minCapacity大,所以返回10。
然后在进入ensureExplicitCapacity

它会判断最小扩容容量是否大于当前数组的大小,如果大于0表示已经超过当前数组的大小了
就要进行扩容方法

oldCapacity表示旧容量也就是当前数组的大小
int newCapacity = oldCapacity + (oldCapacity >> 1)的意思是老容量的大小加上老容量的一半
右移一位表示除以2的意思。
然后进行判断,如果newCapacity-minCapacity<0表示扩容了1.5倍还是不够,那就已最小容量为准,然后进行数组的拷贝,这样数组就动态扩容了。