前言:arrayList不是在创建时扩容,是在第一次add方法添加元素时才进行扩容,第一次为10,后续扩容为当前的1.5倍
debug进new ArrayList()源码中查看
将一个空数组赋给当前数组(arraylist底层是数组,就是这个elementData)
"DEFAULTCAPACITY_EMPTY_ELEMENTDATA"为一个空数组
然后进入到第一次执行add方法中
执行到ensureCapacityInternal(size为定义的一个int型变量,默认为0,这里表示的是当前add了多少个元素)
进入到ensureCapacityInternal中,if判断当前数组是否为一个空数组,为空的话执行Math.max(),这个方法是将两个参数做一个三元表达式,DEFAULT_CAPACITY为10,是arraylist第一次扩容大小。执行完后当前所需最小容量minCapacity为10.
执行到ensureExplicitCapacity方法中,判断当前所需最小容量减去当前数组大小,大于0则表示需要扩容,grow()方法内部就是扩容实现
第一行将原数组大小存入oldCapacity中
第二行是确定扩容大小,newCapacity是新数组大小,oldCapacity >> 1右移一位,÷2(相加后为原来的1.5倍),当前oldCapacity为0,所以newCapacity也为0
第三行判断新数组大小减去最小容量大小,进入if体内
第四行直接将新数组大小赋为当前最小需要容量为10(这里就是arraylist第一次扩容为10的原因)
第五行是用当前新数组大小减去integer最大值的大小(MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;)防止数组大小超过最大值
第七行将老数组中的元素赋给新数组中,新数组容量为原来的1.5倍(第一次add容量为10)
执行完后将add的值添加进数组中返回,第一次数组扩容完成。
由于第一次add的容量为10,这里在添加到11个元素的时候看看内部实现
运行到ensureCapacityInternal方法由于当前不是空数组了,所以直接执行ensureExplicitCapacity
可以看到第二行代码中oldCapacity>>1运算出来为5,加上oldCapacity的10为15,扩容为原来的1.5倍
扩容1.5倍第一次是15,第二次就是15+(15/2)=22