ArrayList的扩容机制

private  void  ensureCapacityInternal( int  minCapacity) {
         modCount++; //定义于ArrayList的父类AbstractList,用于存储结构修改次数
         // overflow-conscious code
         if  (minCapacity - elementData.length >  0 )
             grow(minCapacity);
     }  
     private  void  grow( int  minCapacity) {
         // overflow-conscious code
         int  oldCapacity = elementData.length;
         int  newCapacity = oldCapacity + (oldCapacity >>  1 ); //新容量扩大到原容量的1.5倍,右移一位相关于原数值除以2。
         if  (newCapacity - minCapacity <  0 )
             newCapacity = minCapacity;
         if  (newCapacity - MAX_ARRAY_SIZE >  0 )
             newCapacity = hugeCapacity(minCapacity);
         // minCapacity is usually close to size, so this is a win:
         elementData = Arrays.copyOf(elementData, newCapacity);
     }
     private  static  int  hugeCapacity( int  minCapacity) {
         if  (minCapacity <  0 // overflow
             throw  new  OutOfMemoryError();
         return  (minCapacity > MAX_ARRAY_SIZE) ?
             Integer.MAX_VALUE :
             MAX_ARRAY_SIZE; //MAX_ARRAY_SIZE和Integer.MAX_VALUE为常量,详细请参阅下面的注解
     }
   
    通过以上代码,我们可知java自动增加ArrayList大小的思路是:向ArrayList添加对象时,原对象数目加 1 如果大于原底层数组长度,则以适当长度新
建一个原数组的拷贝,并修改原数组,指向这个新建数组。原数组自动抛弃(java垃圾回收机制会自动回收)。size则在向数组添加对象,自增 1
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值