Collection接口的实现类ArrayList的扩容机制

          

    进入源码

/*
*1.先进入构造器,DEFAULTCAPACITY_EMPTY_ELEMENTDATA为一个空Object数组,所以初始化为一个空数组
*   public ArrayList(){
         this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
       }
*2.先对其进行自动装箱,返回包装类对象
*   public static Integer valueOf(int i) {
    if (i >= IntegerCache.low && i <= IntegerCache.high)
                return IntegerCache.cache[i + (-IntegerCache.low)];
    return new Integer(i);
  }
*3.进入到add方法中去,进入方法ensureCapacityInternal(翻译:确保内部空间),跳转到该方法
*    public boolean add(E e) {
           ensureCapacityInternal(size + 1);  // Increments modCount!!
           elementData[size++] = e;
      return true;
   }
*4.进入方法,判断是否为空数组,进入由math.max()确定最大值,由于DEFAULT_CAPACITY=10,写死了,
* 由于minCapacity = 0+1,意思就是最小空间需要几个,取得最大10个空间,minCapacity = 10;
* 进入方法ensureExplicitCapacity(minCapacity);
*  private void ensureCapacityInternal(int minCapacity) {
if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
    minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity);
}

ensureExplicitCapacity(minCapacity);
}
*5.判断当前最小容量是否大于当前数组,则进入grow(minCapacity)真正的进行扩容,
* private void ensureExplicitCapacity(int minCapacity) {
 modCount++;

// overflow-conscious code
if (minCapacity - elementData.length > 0)
    grow(minCapacity);
}
* 6.进入该方法,第一次容量为oldCapacity = 0,
*  int newCapacity = oldCapacity + (oldCapacity >> 1);
* 这套算法没有改变空间的大小,进行判断由于minCapacity= 10
* 把它赋值给newCapcity,由Array类进行 Arrays.copyOf(elementData, newCapacity);创建数组的大小
* 然后逐层返回方法;
* private void grow(int minCapacity) {
// overflow-conscious code
   int oldCapacity = elementData.length;
   int newCapacity = oldCapacity + (oldCapacity >> 1);
   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);
  }
  * 7.直到返回到add方法,进行添加元素 elementData[size++] = e;的操作
  * 并且每一次添加元素都会进入进行判断的校验
  *  public boolean add(E e) {
   ensureCapacityInternal(size + 1);  // Increments modCount!!
  elementData[size++] = e;
  return true;
* */

所以综上所述扩容机制是走无参构造器的话,先进行10的大小容量先经行扩容,而后minCapacity的容量不够后进行自身1.5倍进行扩容。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值