public class EX1 {
public static void main(String[] args) {
ArrayList<Integer> objects = new ArrayList<>(0);
objects.add(1);
System.out.println(objects.size());
}
}
进入add()方法源码:
public boolean add(E e) {
modCount++;
add(e, elementData, size);
return true;
}
其中,size
为ArrayList包含的元素数,elementData
是一个Object[]数组,用于存贮元素。
继续进入add(e, elementData, size)
方法
private void add(E e, Object[] elementData, int s) {
if (s == elementData.length)
elementData = grow();
elementData[s] = e;
size = s + 1;
}
上述逻辑为:当elementData
已满,利用grow()
进行扩容。
private Object[] grow() {
return grow(size + 1);
}
private Object[] grow(int minCapacity) {
return elementData = Arrays.copyOf(elementData,
newCapacity(minCapacity));
}
private int newCapacity(int minCapacity) {
// overflow-conscious code
int oldCapacity = elementData.length;
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;
}
return (newCapacity - MAX_ARRAY_SIZE <= 0)
? newCapacity
: hugeCapacity(minCapacity);
}
上述逻辑为,假如初始容量为0,那么第一次扩容,容量为10,之后每次扩容将ArrayList新容量newCapacity扩大为原来容量oldCapacity的1.5倍,如果新容量小于最小容量,那么把最小容量作为扩容后的容量。否则,判断新容量是否超出最大数组体积 MAX_ARRAY_SIZE:未超出,则以新容量创建数组;超出,执行hugeCapacity(minCapacity):将Integer.MAX_VALUE作为新容量。
private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;
private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};
private static int hugeCapacity(int minCapacity) {
if (minCapacity < 0) // overflow
throw new OutOfMemoryError();
return (minCapacity > MAX_ARRAY_SIZE)
? Integer.MAX_VALUE
: MAX_ARRAY_SIZE;
}
总之,ArrayList利用grow方法扩容,有五个等级:默认容量10——>1.5倍的旧容量——>数组需要的最小容量——>数组最大体积Integer.MAX_VALUE - 8——>整形最大值Integer.MAX_VALUE