说到集合,常常有面试官会问到ArrayList的扩容问题,今天就来谈谈这一方面的知识。
首先看JDK1.8的源码是怎么样的。
private void grow(int minCapacity){
//overflow-conscious code
int oldCapacity = elementData.length;
int newCapacity = oldCapacity + (oldCapacity >>1 );
if(newCapacity - minCapacity < 0)
newCapacity = minCapacity;
if(newCapacity - MAX_ARRAY_SIZE > 0)
newCapacity = hugeCapacity(minCapacity);
//minCapacity is usually close to size, so this is a win;
elementData = Arrays.copyOf(elementData,newCapacity);
}
private static int hugeCapacity(int minCapacity){
if(minCapacity < 0) //overflow
throw new OutOfMemoryError();
return (minCapacity > MAX_ARRAY_SIZE) ? Integer.MAX_VALUE : MAX_ARRAY_SIZE;
}
从源码我们可以看到,发生扩容的主要代码:
int newCapacity = oldCapacity + (oldCapacity >> 1);
当发生扩容时,新数组长度先扩容至原数组长度的1.5倍。
但是我们还需要往下看,
if(newCapacity - MAX_ARRAY_SIZE > 0)
newCapacity = hugeCapacity(minCapacity);`
若该新数组长度比最大数组长度大,则新数组长度为传入数组的长度。
最后,该grow()方法还调用了Arrays.copyOf()方法,将elementData中的数据复制到新数组。
至此,结束。