ArrayList底层扩容机制详解保姆级

我们对下面代码进行debug,当我们使用无参构造器时,也就是没用指定ArrayList的容量的时候他他是空的,当我们第一次添加的时候才会扩容为10,当容量满之后每次会以1.5倍进行扩容。

 

当我们new之后elementData是空的 ,只有执行add方法后才会初始化容量,在add方法中会判断时候需要扩容,这个判断是每次执行add方法时都要判断的,由此我们可以看出ArrayList 的效率并不高。

 在方法内我们会判断elementData是否为空通过前面的分析我们知道这个判断是成立的,if判断内会将 DEFAULT_CAPACITY, minCapacity中大的那个赋值给minCapacity,之后进入ensureExplicitCapacity()方法.

 modCount是用来记录集合被修改的次数,为了防止多个线程同时操作同一个集合。

紧接着进入grow方法这个才是我们真正进行扩容的方法,先将elementData的长度保存起来, int newCapacity = oldCapacity + (oldCapacity >> 1);这个就相当于1.5倍,右移一位相当于➗2也就是0.5.下面的第一个if判断设计的非常巧妙,当你第一次扩容时并没有直接按照1.5倍数扩容而是将容量设置为10,最后进行数组的拷贝就可以

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值