【ArrayList扩容机制】详解ArrayList源码

首先ArrayList的底层是Object[],所以归根结底他还是数组,不过是可以自动扩容,点进去ArrayList的源码,可看出初始的默认数组容量为10。

img

然后看看他的构造器,是可以传入capacity的

img

另一个空参构造器,当然用的就是默认容量

img

然后我们来看一下add代码是如何编写的

img

看起来是不是很简单,就只有改变当前集合长度和把数据加入进去,但是其实里面是有自动扩容的代码逻辑的

img

其中参数中的calculateCapacity的方法代码如下:

img

可以看出我们在其中会判断刚刚add之前的底层Object数组是否为Empty,如果谁的话就直接赋值为Default = 10,否则当然就是赋值为我们传入的参数+1咯。

知道了ensureExplicitCapacity的参数内部方法之后,就来研究这个方法是干啥的,直接贴源码

img

注意此时的minCapacity就是我们上面解释的(default或者参数+1)

img

这里出现了一个modCount的成员变量,点进去看看,结果就到了父类AbstractList

img

上面的注解大概意思是我们想要用快速迭代器,就得在add中+1,remove中减1不然会报错,这个是可选的。

看完这个modCount就可以看代码逻辑了,终于到了扩容的实现代码,核心代码就是这个grow,grow这个方法传入了我们现在add后的长度,估计得依照这个来扩容

img

这段代码很好看懂,首先有一个oldCapacity代表Object数组的长度,然后将他变为原来的1.5倍之后和传入的参数比较,如果minCapacity大,那就用传来的参数,如果比MAX_ARRAY_SIZE大就得进入另一个方法考虑了,这里贴出MAX_ARRAY_SIZE的数值

img

那我们就看看他是怎么处理容量都快超过Integer最大值的这种情况吧

img

可看出如果当前参数大于Max返回int的最大值,否则用较大的MAX_ARRAY_SIZE!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值