【Java-集合】ArrayList的自动扩容

直接上源码,JDK1.8中的ArrayList;

//往ArrayList中新增一个元素var1
public boolean add(E var1) {
    this.ensureCapacityInternal(this.size + 1);
    this.elementData[this.size++] = var1;
    return true;
}

//新增元素前确保集合容量足够检查
private void ensureCapacityInternal(int var1) {
    //为空时初始化默认为10
    if(this.elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
        var1 = Math.max(10, var1);
    }

    this.ensureExplicitCapacity(var1);
}

//如果当前的所需的容量大于当前容量,调用grow方法
private void ensureExplicitCapacity(int var1) {
++this.modCount;
 if(var1 - this.elementData.length > 0) {
     this.grow(var1);
 }

//新的集合容量 = 当前容量 + (当前容量 >> 1);新的集合将复制获取到旧集合的顺序数据,然后旧集合将被回收
private void grow(int var1) {
    int var2 = this.elementData.length;
    int var3 = var2 + (var2 >> 1);
    if(var3 - var1 < 0) {
        var3 = var1;
    }

    if(var3 - 2147483639 > 0) {
        var3 = hugeCapacity(var1);
    }

    this.elementData = Arrays.copyOf(this.elementData, var3);
}
}

(1)ArrayList先检查 当前size+1,当前数组是否可以支持。

(2)如果不支持,new新数组,新数组size = 当前容量 + (当前容量 >> 1)

(3)newArray = Arrays.copyOf(this.elementData, newElement);将旧数组与最新的元素数据置值到新数组中。旧数组完成回收

更多互联网与金融技术精华:http://www.moxianbin.com/

你可能感兴趣的:(Java,集合,ArrayList,自动扩容)