- 添加元素
使用当前容器元素数量
size
+ 1 去计算得到一个容器可以存放下新元素的最小容量容器容量即
elementData.length
,不等于容器元素数量size
在计算时,首先判断
elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA
说明是使用无参构造器构建的对象并且是第一次添加元素,那么就返回Math.max(DEFAULT_CAPACITY, minCapacity)
作为所需的最小容量;否则的话就直接返回size+1
作为所需的最小容量- 如果计算得到所需最小容量已经大于容器当前容量了,那么就需要扩容
- 使用当前集合的容量也就是
elementData
的长度,将此长度扩大1.5倍得到一个值newCapacity
,比较newCapacity
和minCapacity
使用较大的值作为新的容量; - 并且在扩容过程中,会判断新的容器容量是否大于
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