解说:上面代码块 ensureCapacityInternal 方法调用grow(minCapacity); 如下代码:
private void grow(int minCapacity) { // 老容量 int oldCapacity = elementData.length; // 新容量,算法为老+(老/2),例如:10+(10/2) int newCapacity = oldCapacity + (oldCapacity >> 1); if (newCapacity - minCapacity < 0) newCapacity = minCapacity; if (newCapacity - MAX_ARRAY_SIZE > 0) newCapacity = hugeCapacity(minCapacity); // 设置为新容量,并重新赋值 elementData = Arrays.copyOf(elementData, newCapacity); }解说:上面代码块 grow方法为容量扩展方法
//当minCapacity > MAX_ARRAY_SIZE 取Integer最大值,否则取MAX_ARRAY_SIZE,也就是Integer最大值-8 //private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8; private static int hugeCapacity(int minCapacity) { if (minCapacity < 0) // overflow throw new OutOfMemoryError(); return (minCapacity > MAX_ARRAY_SIZE) ? Integer.MAX_VALUE : MAX_ARRAY_SIZE; }总结:
1)
创建ArrayList时是没有分配空间的,只是一个空数组,相当于一个声明的变量。
2)
1.调用add方法时,如果没有指定初始容量,那么会给ArrayList初始容量10。
2.在每次调用add方法都会判断是否需要扩充容量,
用法是:用当前元素最大数量+1(size+1)> 容量(elementData.length)
上述说明:如果当前元素已满,容量不足,那么调用扩充容量的方法grow(int minCapacity)
容量规则是:当前容量的1.5倍,直到Integer最大值-8,如果还需扩展则最大为Integer最大值
注:如有不合理之处请指点,莫让我误人子弟呀。