ArrayList中的addAll方法原来是这样的!

目录

第一步:校验索引

第二步:将目标集合转换成数组

第三步: 确保容量

第四步:两次拷贝

源码如下:

第一步:校验索引

rangeCheckForAdd(index)

 这一步的目的就是校验索引是否有效,若超出范围或者索引小于0,那么会抛出索引越界异常!

第二步:将目标集合转换成数组

其中numNew就是该数组的长度

第三步: 确保容量

 这一步主要是为了防止你的集合容量不够大,装不下要添加进来的集合,所以去判断容量是否足够大;

若容量满足,则按当前容量处理;若容量不够,且看下一步:grow(minCapacity)

 

很容易理解,首先,当进入扩容处理时,当前集合长度肯定是旧集合长度加上你将要添加进来的集合长度总长;

所以,集合默认先扩容一次:

int newCapacity = oldCapacity + (oldCapacity >> 1);

oldCaoacity = 旧集合长度;

newCapacity = 默认扩容长度;

 

若扩容一次还不满足,那么将你未来生成的集合长度minCapacity赋值给新的集合长度newCapacity;然后进行下一步判断:

 

 假如新的集合长度超过了集合的最大长度(Integer的最大值-8),那么新的集合长度将被赋值为Integer的最大值(2147483647);此外将集合复制到临时集合中,再复制回当前集合,那么当前集合的长度已经被改为了 newCapacity的长度;

第四步:两次拷贝

System.arraycopy(elementData, index, elementData, index + numNew,numMoved);

参数解释: elementData(第一个):源集合; index:源集合开始复制索引位置

                elementData(第二个):目标集合;index+numNew : 目标集合开始位置

                numMoved: 将要复制的个数

第一次拷贝,它是为了预留将要添加进来的集合的位置;

 第二次拷贝,它是添加 将要添加的集合到目标位置;

最后 集合的大小size += numNew!!!

操作就完成了!

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值