ArrayList#add.png

    1. 添加元素
    2. 使用当前容器元素数量 size + 1 去计算得到一个容器可以存放下新元素的最小容量

      容器容量即 elementData.length,不等于容器元素数量 size

    3. 在计算时,首先判断 elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA 说明是使用无参构造器构建的对象并且是第一次添加元素,那么就返回Math.max(DEFAULT_CAPACITY, minCapacity) 作为所需的最小容量;否则的话就直接返回 size+1 作为所需的最小容量

    4. 如果计算得到所需最小容量已经大于容器当前容量了,那么就需要扩容
    5. 使用当前集合的容量也就是 elementData 的长度,将此长度扩大1.5倍得到一个值 newCapacity,比较 newCapacityminCapacity 使用较大的值作为新的容量;
    6. 并且在扩容过程中,会判断新的容器容量是否大于 MAX_ARRAY_SIZE其值是 Integer.MAX_VALUE-8,如果最小容量是负数,说明整型溢出之间抛出 OOM,否则的话再判断所需最小容量是否大于 MAX_ARRAY_SIZE,如果大于则用 Integer.MAX_VALUE 作为新的容量,不然就使用 MAX_ARRAY_SIZE 作为新的容量。

    可以得出一下推论:

    • 使用默认构造器构建的 ArrayList 对象在第一次添加元素时才确定容器的容量是10
    • 每次扩容都是原来的1.5倍
    • ArrayList 的最大容量是 Integer.MAX_VALUE