arraylist扩容是创建新数组吗 java_ArrayList的扩容机制

ArrayList是List接口的实现类,它是支持根据需要而动态增长的数组。java中标准数组是定长的,在数组被创建之后,它们不能被加长或缩短。这就意味着在创建数组时需要知道数组的所需长度,但有时我们需要动态程序中获取数组长度。ArrayList就是为此而生的。

因此,了解它的扩容机制对使用它尤为重要。

ArrayList扩容发生在add()方法调用的时候,下面是add()方法的源码:

public booleanadd(E e) {//扩容

ensureCapacityInternal(size + 1); //Increments modCount!!

elementData[size++] =e;return true;

}

根据意思可以看出ensureCapacityInternal()是用来扩容的,形参为最小扩容量,进入此方法后:

private void ensureCapacityInternal(int minCapacity) {

ensureExplicitCapacity(calculateCapacity(elementData, minCapacity));

}

通过方法calculateCapacity(elementData, minCapacity)获取:

private static int calculateCapacity(Object[] elementData, intminCapacity) {//如果传入的是个空数组则最小容量取默认容量与minCapacity之间的最大值

if (elementData ==DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {returnMath.max(DEFAULT_CAPACITY, minCapacity);

}returnminCapacity;

}

ensureExplicitCapacity方法可以判断是否需要扩容:

private void ensureExplicitCapacity(intminCapacity) {

modCount++;//如果最小需要空间比elementData的内存空间要大,则需要扩容

if (minCapacity - elementData.length > 0)//扩容

grow(minCapacity);

}

接下来重点来了,ArrayList扩容的关键方法grow():

private void grow(intminCapacity) {//获取到ArrayList中elementData数组的内存空间长度

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);//调用Arrays.copyOf方法将elementData数组指向新的内存空间时newCapacity的连续空间//并将elementData的数据复制到新的内存空间

elementData =Arrays.copyOf(elementData, newCapacity);

}

从此方法中我们可以清晰的看出其实ArrayList扩容的本质就是计算出新的扩容数组的size后实例化,并将原有数组内容复制到新数组中去。

到此扩容就基本完成了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值