在list集合中有一个add方法:
在众多类中,最长使用的是ArrayList,其中有个方法是add方法
在add方法底层存在
private int size;
ensureCapacityInternal(size + 1)
其中的size+1会对add()方法的调用次数进计数,每调用一次加1;
下边有个数组是elementData[] 中的size++,用来确定存储对象的位置
在ensureCapacityInternal方法中,定义了一个minCapacity (最小容量)的参数
如果最小容量比数组长度大,那么调用grow方法更新数组
1.指定一个初始的数组长度为10,将数组长度传给初始容量
2.初始化了一个新的容量是初始容量的1.5倍
如果入参长度小于新的容量那么,数组长度扩容为初始的1.5.倍
如果入参长度大于新的容量那么就把入参长度作为数组长度,
如果还不够,那么就会传给一个int的最大范围
如果int最大范围还不够,会传Integer.MAX_VALUE给这个数组,
其中 MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;
总结一下:
MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8
list底层创建了一个elementData数组,长度为10,
创建了一个oldcapacity(初始容量)用来记录数组长度
创建了newcapacity(新容量)的长度为初始容量的1.5倍;
用方法ensureCapacityInternal中的minCapacity(最小容量)来接收传入elementData数组的长度,当最小容量小于elementData数组的初始化长度(10)的时候,使用默认长度,当最小容量大于初始化长度,那么使用Arrays.copyOf方法将elementData数组长度扩容为原来1.5倍,如果1.5倍还是不够那么最小容量是多少就给定多大的elementData的长度,如果并且被付给的新容量达到了比MAX_ARRAY_SIZE还大的程度,就会把Integer.MAX_VALUE的值付给elementData(将该数组扩容到最大)