ArrayList底层原理

一、创建ArrayList

当我们在new一个ArrayList如果是空参时


底层会创建一个名字为elementData长度为0的数组。


二、添加元素

1、ArrayList无元素时

在我们执行add添加一个元素时


此时还未添加完成时数组长度为0,size初始化为0,需要进行grow()方法

因为时add只能添加一个元素所以size+1也就是最小容量minCapacity,我们看到grow方法先记录数组长度作为老容量,判断是否是空数组,我们现在的情况就是空数组所以走else,else是为elementData  new了一个新数组,其容量用默认容量和最小容量进行对比,选大的默认容量是10

这一步就是以防我们新建一个数组后直接addAll()加入大量数据这样就可以根据添加的量来觉得开多少的空间。
小结:当ArrayList内无元素时,添加10以内数据量会开辟10容量的数组,如果添加10以上的数据量就会开辟对应数据量的数组。

2、ArrayList有元素时

如果ArrayList有元素则进入if会执行一个newLength方法

newLength传递三个参数老容量,需要增加的容量(最少容量-老容量)默认增加容量(老容量/2)用需要增加的容量和默认增加容量进行对比取大的和老容量相加则得到新数组所要的长度。,如果长度过大则会报错。

返回后执行copyof方法创建一个对应容量的新数组并将值赋值给新数组。

小结:当ArrayList有元素时,添加多个元素如果元素数量没有超过原来的1.5倍则会创建一个原数组1.5倍大的新数组,如果超过了原来的1.5倍则按需要的容量加上老容量作为新数组的长度。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值