认识一个类一般都要从类的构造方法开始
构造方法有三种:1、无参构造;2、利用其他collection构建ArrayList;3、指定顺序表初始容量
以无参构造为例:



“先检测是否有可供插入的空间,然后将目前数组末尾的下一位下标的值设定为参数”
那么它是怎样检验是否可以插入的?

ensureCapacityInternal()方法是为了确保 拿到的的数组容量满足使用。
我们通过源码了解到,ensureCapacityInternal中又有两个方法:ensureExplicitCapacity、calculateCapacity
先来看calculateCapacity

如果ArrayList的底层数组elementData为DEFAULTCAPACITY_EMPTY_ELEMENTDATA(通过查看源码中的成员属性可以得知这是一个空数组)时,返回10(通过查看源码得知:当向起始的空数组中插入元素时,会给这个空数组赋予10个容量)和minCapacity(参数)的最大值,否则返回minCapacity的值(minCapacity被视为数组容量)
这个方法为了得知 需要的数组容量。

如果当前需要的数组容量 比目前的数组长度大的话,需要进行扩容
这个方法是为了获得 符合要求的数组容量
定义原来的数组长度为旧容量,将旧容量扩容1.5倍后于所需容量minCapacity比较,如果新容量小于mC,就将mC设置为新容量;如果新容量大于数组最大长度(MAX_ARRAY_SIZE)(这是一个常量),就进行一次判断(使用hugeCapacity方法判断):如果需求容量小于0,抛出异常;如果需求容量比数组最大长度还要大,就将新容量定义为Integer的最大值,否则就将新容量定义为数组最大长度


为什么会有MAX_ARRAY_SIZE的定义呢?
因为数组有点特殊性,数组对象要额外存储 数组元素长度 在头部,少了这8个长度可能与此有关。 尝试分配大于 MAX_ARRAY_SIZE 长度的数组会导致 OOM (换句话说,超过了该虚拟机的数组长度限制)。
如果MAX_ARRAY_SIZE的长度还不够用,就直接将Integer的最大值给新数组(数组长度是个Integer类型-是一个整数)。至于会不会因为OOM报错那就不管了
当我们使用remove方法时,会将我们传入的参数识别为一个下标,而不是我们所想的“一个对象”(例如“ArrayList.remove(0)” 删除0下标/删除数字0——“arraylist.remove(new Interger(0))”)——这是因为有两个remove方法,可以传一个下标,也可以传一个对象

从数组fromIndex下标开始,取出toIndex个元素放入subList数组中

如果改变sub(从list中)截取出来的数组中的数据,将会一起改变list中的数据

“sub”和“list”共用一个elementData数组
