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

你可能感兴趣的:(java)