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

2 篇文章 0 订阅
1 篇文章 0 订阅

直接上源码,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/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值