ArrayList 扩容详解

总结:

无参构造:初始化一个空数组,第一次扩容到10,往后是1.5倍扩容。

有参构造:指定长度扩容,初始化指定长度的数组,当数组长度不够用的时候,以指定长度的1.5倍扩容。

第一种: ArrayList arrayList = new ArrayList(); 

无参构造,给elementData赋值DEFAULTCAPACITY_EMPTY_ELEMENTDATA,这是个空数组。

我们走add方法看看,ensureCapacityInternal 翻译过来是:确保内部容量。把size看作集合的长度,size初始是0,只有每次走add方法最后时,size才会+1,因为是第一次添加,所以size为0,minCapacity意思是最小容量,size+1=1,意思是我们第一次添加1个的时候,最小容量也确实是需要1个容量,size+1没毛病。

进入这个方法看看

判断elementData是不是空数组,如果是空数组时,取DEFAULT_CAPACITY、minCapacity俩个值的最大值,所以取10,把10赋值给minCapacity

 

我们进入ensureExplicitCapacity方法,翻译过来是:确认明确容量

modCount,记录修改次数,防止多线程同时操作,抛出异常。只做稍微了解

所需要的最小容量大于当前数组的长度,进行扩容,走grow方法

 当前的数组长度赋值给oldCapacity(老容量),

int newCapacity = oldCapacity + (oldCoapacity >> 1); oldCoapacity向右偏移一位,意思是除以2,这里就可以看出扩容是1.5倍扩容。

由于是一次add,newCapacity计算后记过还是0,if判断后newCapacity=10,然后

Arrays.copyOf(elementData, newCapacity);复制老数组给新数组

最后把元素添加到数组里

第二种: new ArrayList(8); 指定长度创建。创建一个指定长度的数组赋值给elementData。

 当集合已经添加完8个元素之后,进行扩容,是8的1.5倍扩容

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值