每次扩容为原来的 1.5倍
首先当我们在用 list.add(Object); 首先 在add的方法执行 ensureCapacityInternal(int minCapacity){} 方法 参数为 当前list.size() + 1
后执行 ensureExplicitCapacity(calculateCapacity(elementData, minCapacity));
先 执行参数中的方法calculateCapacity(Object[] elementData, int minCapacity)
在方法中先 判断 emementDate (等价于 ArrayList 存储元素的数组)是否为空
为空 则 执行return Math.max(DEFAULT_CAPACITY, minCapacity);
DEFAULT_CAPACITY 为 数组初始长度 为10 minCapacity=为 ArrayList当前数组动态数组长度
Math.max(); 比较 DEFAULT_CAPACITY 和 minCapacity 大小 输出 大的那个数 为长度
得到参数后然后在执行ensureExplicitCapacity(int minCapacity) 如果 参数 减去ArrayList.length >0
就执行 grow(minCapacity); 方法
int oldCapacity = elementData.length; //定义一个现有的长度
int newCapacity = oldCapacity + (oldCapacity >> 1); //定义一个 新长度
if (newCapacity - minCapacity < 0) //如果新长度减去 参数的长度 小于0
newCapacity = minCapacity; //那么长度就为 这个参数
if (newCapacity - MAX_ARRAY_SIZE > 0) //新长度 减去 数组最大长度
newCapacity = hugeCapacity(minCapacity); //新长度 为 int最大的值
private static int hugeCapacity(int minCapacity) {
if (minCapacity < 0) // overflow
throw new OutOfMemoryError();
return (minCapacity > MAX_ARRAY_SIZE) ? // 执行 hugeCapacity 将 最大的值给 minCapacity
Integer.MAX_VALUE :
MAX_ARRAY_SIZE;
}
// minCapacity is usually close to size, so this is a win:
elementData = Arrays.copyOf(elementData, newCapacity); // 将 newCapacity 给 elementData