1.一开始如果是空的构造函数时,会创造一个空的object数组,如果给定了数组的长度则创建给定长度的数组
2.在调用第一次Add方式的时候,创建了一个10个长度的Object数组
3.在不断的调动add方法会触发grow()方法
奔着n+(n>>1)(向右移动一位,基本上就是每次乘以1.5(1.5是综合测试所得,基本上这样的效率比较高))
动态添加具体的实现代码:
private void grow(int minCapacity) {//传入原数组长度加一
int oldCapacity = elementData.length;//原数组长度
int newCapacity = oldCapacity + (oldCapacity >> 1);//原数组长度+原数组长度二进制右移一位的大小(大约为乘以1.5)
if (newCapacity - minCapacity < 0)//新数组长度比原数组长度加一小(例如最初数组长度为1,newCapacity就为1,而minCapacity就为2)
newCapacity = minCapacity;//更新新的数组长度值
if (newCapacity - MAX_ARRAY_SIZE > 0)//新的数组长度值和最大的数组长度(ArrayList中定义的最大长度为Integer最大值减8,这个8就是就是存了数组_length字段。)比较
newCapacity = hugeCapacity(minCapacity);
// minCapacity is usually close to size, so this is a win:
elementData = Arrays.copyOf(elementData, newCapacity);//复制数组内容
}