ArrayList动态扩容原理(部分源码展示)
ArryList的动态扩容:每当执行添加元素的方法,ArrayList会检查内部数组的容量是否足够,如果不够,它就会以当前容量的1.5倍来重新构建一个数组,将旧元素Copy到新数组中,然后丢弃旧数组。
核心方法:
ArrayList的grow方法会判断当前数组容量是否足够,不够就通过copyOf()方法创建一下新的数组并把旧数组的内容copy过去
private void grow(int minCapacity) {
// overflow-conscious code
int oldCapacity = elementData.length;
// 对数组进行扩容,设置新数组的容量扩展为原来数组的1.5倍
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:
//创建新数组,将原来数组的值copy新数组中去, ArrayList的引用指向新数组
// 因此鼓励在合适的时候通过构造方法指定默认的capaticy大小
elementData = Arrays.copyOf(elementData, newCapacity);
}
ArrayList类的部分代码及注释:
public class ArrayList<E> extends AbstractList<E>
implements List<E>, RandomAccess, Cloneable, java.io.Serializable
{
// 声明序列号
private static final long serialVersionUID = 8683452581122892189L;
/**
* Default initial capacity.
*/
// 设置默认容量
private static final int DEFAULT_CAPACITY = 10