关于ArrayList的扩容机制

1.什么是ArrayList

ArrayList是java中集合类的实现的一种,实际上是一个动态数组,底层是用数组的实现的,随机访问效率高,随即删除,修改效率低,线程不安全

这里有一个关键词动态数组,有的人会问你ArrayList和数组有什么区别,数组其实当初定义的时候给定的大小是不可变的,而ArrayList与之最大的区别就是ArrayList可以进行扩容,相信大家使用的时候也很少考虑使用ArrayList的时候存满了怎么办。

2.ArrayList的扩容

那我们这里就看一下他是如何做到动态的,其实都归功于他的扩容机制,我们在创建一个ArrayList集合但是并没有给定大小的时候,一开始其实他是一个空数组大小为0可以看代码:

然后我们在使用.add()添加第一个元素的时候当前size为0,调用calculateCapacity()方法返回一个大小为10 ,“DEFAULT_CAPACITY”(也就是图片红框默认为10)

然后到ensureExplicitCapacity()方法和当前数组大小进行比较

因为我们是第一次添加所以数组大小为0,10-0>0所以进行grow(10)扩容,按照正常扩容应该是当前容量的1.5倍(当前容量+当前容量向右位移计算(0.5倍)),但是由于我们是第一次添加所以当前容量为0,0*1.5 还是等于0 所以把我们刚才的默认值10当作数组容量

然后它使用的是Arrays.copyOf()方法copy了一个新的数组容量大小为10

最后把我们添加的第一个元素放入容量为10的新数组中,当我们一直存放元素超过10的时候会进行第二次扩容走的就是上边的正常扩容的1.5倍。

总结

所以总的来说就是一句话

当前容量+1大于当前数组大小时就会进行扩容到当前容量的1.5倍

minCapacity(size+1) - elementData.length>0

大白话就是:当要存储的大小超过当前数组大小的时候就会进行扩容到当前容量的1.5倍

是不是很简单呢,so easy,如果有什么地方说的不对请在评论区指正!!!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值