【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/

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ArrayList自动扩容是指当ArrayList中的元素个数超过了已分配的数组长度时,会自动对数组进行扩容。具体来说,当需要添加元素到ArrayList中时,如果当前元素个数已经达到了数组的长度,就会触发扩容操作。扩容操作会创建一个新的更大的数组,并将原数组中的元素复制到新数组中。通常情况下,ArrayList扩容是以原来数组长度的1.5倍进行扩容的。这样做的目的是为了减少频繁的扩容操作,提高性能。\[1\]\[2\] #### 引用[.reference_title] - *1* [【Java集合ArrayList自动扩容机制分析](https://blog.csdn.net/cy973071263/article/details/128690099)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [ArrayList自动扩容(详细篇)](https://blog.csdn.net/lz17267861157/article/details/131348110)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [ArrayList扩容机制](https://blog.csdn.net/TiankkTT/article/details/127221265)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值