流程图:
![](https://i-blog.csdnimg.cn/blog_migrate/f35ace0bf1044041e70f054e92e1c6b8.png)
源码及解析:
add方法:
/*
*ArrayList的add方法有几个重载,最后会来到这个方法
*/
private void add(E e, Object[] elementData, int s) {
if (s == elementData.length) //判断是否需要扩容
elementData = grow(); //如果需要扩容调用扩容方法
elementData[s] = e; //将数据插入到数组尾
size = s + 1; //数组长度更新
}
grow方法:
//add方法里调用的grow方法
private Object[] grow() {
return grow(size + 1);
}
//实际调用的重载方法
private Object[] grow(int minCapacity) {
//newCapacity就是获得新的容量
//Arrays.copyOf是把之前的数组复制到新的数组里
return elementData = Arrays.copyOf(elementData,newCapacity(minCapacity));
}
newCapacity方法:
//获得扩容后容量
private int newCapacity(int minCapacity) {
int oldCapacity = elementData.length;
//这句比较关键,新的容量=旧容量+旧容量右移1位(相当于除2)
int newCapacity = oldCapacity + (oldCapacity >> 1);
//判断溢出的,不用管
if (newCapacity - minCapacity <= 0) {
if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA)
return Math.max(DEFAULT_CAPACITY, minCapacity);
if (minCapacity < 0) // overflow
throw new OutOfMemoryError();
return minCapacity;
}
//如果不溢出就返回新容量,否则返回int类型上限2147483647-8
return (newCapacity - MAX_ARRAY_SIZE <= 0)
? newCapacity
: hugeCapacity(minCapacity);
}