1,Arrlist扩容是原来的数组长度1.5倍,源码上是对原来的数组长度向右位移一位(就是除以2)然后加上原来的数组长度。然后减去原来的数组判断是否小与0如果小与就使用原来的数组长度。下面的判断要分配的数组的最大大小。有些虚拟机在数组中保留一些头词。尝试分配更大的数组可能会导致OutOfMemoryError: Requested array size exceeds VM limit
image.png
2,数组进行扩容时,会将老数据中得元素重新拷贝一份道新的数组中,每次数组容量得增长大于时原用量得1.5倍。
.代价是很高得,因此再实际使用时,我们因该避免数组容量得扩张。尽可能避免数据容量得扩张。尽可能,就至指定容量,避免数组扩容的发生。
3,默认空参创建ArrayList长度是0,
image.png
当然也可以在创建时指定长度
image.png
也可以放一个集合进去,他就会使用c的大小做为容量,如果放入的集合 为null的话会报空值针异常
image.png
4,第一次add添加时会默认初始化长度为10
image.png
5,addAll没有元素时,扩容为Math.max(10,实际元素个数),有元素时为Math.max(原容量1.5倍,实际元素个数)
如果使用addAll添加元素时,要添加的元素长度超过下一次要扩容的长度时,他会使用要添加的元素作为扩容,反正他们两个谁长度大就用谁。