java——ArrayList的底层扩容原理

常见结论:
ArrayList的底层是数组结构(正确
数组的默认长度为10,当数组添加满了的时候,会自动扩容为1.5倍(不完全正确

ArrayList的扩容过程:

第一种情况:元素单个添加:

第一步:创建数组:
ArrayList<String> list = new ArrayList<>();

此时在底层会创建一个默认长度为0的数组,名字叫做elementData;
还有一个成员变量,叫Size,用来记录元素的个数,最开始Size=0。

第二步:往集合里添加数据:

list.add("A");//添加了一个元素,Size=1(记录的是元素的个数),注意此时集合的长度为10底层数组的长度为10);
list.add("B");//又添加了一个数据,Size=2,默认长度仍然为10;
list.add("C");//以此类推。

直到加到了10

1.首先:底层就会创建一个新的数组,这个数组的长度是10*1.5=15扩容因子为1.5);

2.其次:底层就会调用一个数组工具类里面的Arrays.copyof()方法将老的数组中的数据拷贝到新的数组里面去;

3.最后:再将新的数据继续装到新数组里就可以了。

OK,单个元素的添加情况就是这样

第二种情况:元素批量加入:

第一步:创建一个集合:
ArrayList<String> list1=new ArrayList<>();

我们假设这个集合有100个元素,

第二步:将这个新的集合里的元素一次性加入到第一个的集合中(使用addAll() 方法)

list.addAll(list1);


那第一个集合肯定扩容成15肯定还不够
所以此时他是直接加进去,所以此时第一个集合的长度为100+3=103,100是新加的,3是原本有的(之前添加的A,B,C)

(也就是底层创建了一个长度为103新数组

底层逻辑:

这两种情况:在代码的底层,会有一个Arrays.Max()的方法去比较默认新增的长度(也就是5嘛)和实际需要新增的长度(也就是100嘛)
比较一下谁大,谁大那我们就扩容多少长度


                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值