关于ArrayList的扩容机制

ArrayList的扩容底层机制

一、使用无参构造的方式创建

​ 1、首先创建了一个空的elementData数组

DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};
在这里插入图片描述
2、如果添加的数据类型是基础类型的包装类,首先都会进行自动装箱操作,如果是Double就调用Double的valueof()方法,并返回
在这里插入图片描述
3、进入add()
在这里插入图片描述
3.1 在add()方法中首先调用ensureCapacityInternal(size+1),确认容量大小是否扩容,然后将元素在赋值给elementData[Size++]=e;

该方法确定初始的minCapacity,第一次默认扩容为10.在这里插入图片描述
​ 3.2如果elementData的大小不够,就调用grow()方法去扩容.
在这里插入图片描述
3.3第一次调用grow方法,分析下列扩容机制,可知newCapacity=10
在这里插入图片描述
​ 扩容成功,elementData数组中有10个空元素
在这里插入图片描述
4.进行赋值,size初始值为0,elementData[Size++]=e; 并return true;
5.添加成功第一个元素后,elementData数组第一个位置就有值了,size+1,modcount+1.

在这里插入图片描述
5.当如果加入10元素满了后,再加入第11个元素的时候,又进行重新的扩容.
在这里插入图片描述
​ 5.1进入add方法,调用ensureCapacityInternal(10+1)
在这里插入图片描述
​ 5.2 11>10,进入grow(11).
在这里插入图片描述
5.3 由原来的10扩容为15,之后的扩容都是为原来的1.5倍
在这里插入图片描述

二、使用带参构造的方式创建

有如下代码:

        ArrayList<Object> arrayList = new ArrayList<>(8);
        for (int i = 1; i <=10 ; i++) {
            arrayList.add(i);
        }

2.1首先进入带参构造方法
在这里插入图片描述
2.2下面其他的步骤跟无参构造的步骤都一样,扩容机制都为
int newCapacity = oldCapacity + (oldCapacity >> 1);

在原来的initialCapacity的基础上扩容1.5倍

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

2年工作经验的小胡歌

你的打赏是对博主最大的支持和鼓

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值