Java集合框架之ArrayList源码分析及如何扩展容量(2)

解说:上面代码块 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最大值


注:如有不合理之处请指点,莫让我误人子弟呀。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/475e6e2060e0e671f2a09d481aef973a.html