ArrayList的扩容机制

ArrayList是一个支持随机访问的动态数组,当执行add()方法时,它的底层发生了很多判断机制,数组大小不够怎么办?什么时候扩容?我们来深挖一下它的底层源码。


我们可以看到当执行add()方法时,首先会调用ensureCapacityInternal()这个方法,来保证容量足够,之后再将新添加的元素e放到新扩充容量的位置。我们再来细看ensureCapacityInternal()这个方法

ensureCapacityInternal()上面传入的参数是size+1,size是当前数组的元素个数大小。方法进来以后,先判断当前数组是否为空数组,DEFAULTCAPACITY_EMPTY_ELEMENTDATA是ArrayList前面定义的空数组,如果是的话,则取定义的最小容量和默认大小的最大值,DEFAULT_CAPACITY大小前面定义为10。之后在进行ensureExplicitCapacity(minCapacity)的方法。

这里的modCount++先不暂且不管,如果新扩充容量大于目前元素的大小时,则终于开始进行扩容grow()方法。

在grow()方法中,首先对旧容量oldCapacity进行1.5倍的扩容,之后如果newCapacity仍然小于最小要求容量minCapacity,就把minCapacity的值给到newCapacity。如果newCapacity的值大于最大要求容量,则会走hugeCapacity()方法,进行一个最终扩容后的大小确认,最后调用Arrays.copyof()方法,在原数组的基础上进行复制,容量变为newCapacity的大小。


你可能感兴趣的:(ArrayList的扩容机制)