ArrayList数组动态扩容的源码分析

本文详细解读了ArrayList的构造过程,重点介绍了如何在add元素时触发动态扩容,涉及ensureCapacity方法、minCapacity计算以及首次和后续扩容策略。
摘要由CSDN通过智能技术生成
 
 
 ArrayList arrayList = new ArrayList();//无参的构造器
        ArrayList arrayList1 = new ArrayList(8);
        //使用for循环添加1-10个数据
        for(int i=1;i<=10;i++){
            arrayList.add(i);
        }
        for(int i=11;i<=15;i++){
            arrayList.add(i);
        }
        arrayList.add(100);
        arrayList.add(200);
        arrayList.add(null);

使用new ArrayList();进行构造函数时调用的是以下的构造器,因此elementData初始化是一个空数组,

ensureExplicitCapacity(10); minCapacity为最小期望大小=10,判断10-0》0 需要进行grow(minCapacity)需要进行扩容到minCapacity

执行到arraList.add(i); 初始时,size=0;,进入ensureCapacityInternal(0+1);最小容量minCapacity=1,

判断当前elementDat是否==DEFALUTTCAPACITY_EMPTY_ELEMENTDATA,判断为true,Math.max(DEFAULT_CAPACITY,minCapacity)  ,即Math.max(10,1) 返回10.故调用所以返回10,否则不是第一次扩容就返回真正需要扩容的大小

进行扩容判断,使用minCapacity-当前数组的长度,如果小于0就进行扩容,即调用grow(minCapacity).因为当前minCapacity=10,elementData.length=0,所以调用grow(10),进行第一次扩容,扩容10个长度

首先获取原始数组的长度 oldCapacity,然后设置新扩容数组长度为 原数组长度的1.5倍。

因为第一次扩容,新扩容数组长度=0+0/2=0; 所以0<10;设置newCapacity=10;

然后执行Arrays.copy(elementData,10) 把数组的容量扩容为10

后面的数组如果不够的话,就都会在原数组长度的基础上扩1.5倍了,因为elementData不在是DEFALUTTCAPACITY_EMPTY_ELEMENTDATA。

以上就是涉及到ArraList数组动态扩容机制的源码部分

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值