ArrayList扩容机制

1.通过ArrayList的无参构造创建出一个初始长度为0的数组

//源码中的ArrayList 无参构造方法
public ArrayList() {
        this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
    }
//源码解析为创建出一个初始长度为0的Object数组
private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = new Object[0];

2.通过ArrayList的带参构造创建对象

public ArrayList(int var1) {
        //对传入的参数进行判断 大于0 直接创建一个var1长度的数组
        if (var1 > 0) {
            this.elementData = new Object[var1];
        } else {
            //else 后抛出异常
            if (var1 != 0) {
                throw new IllegalArgumentException("Illegal Capacity: " + var1);
            }
            
            this.elementData = EMPTY_ELEMENTDATA;
        }

    }
//长度为0的Object对象数组
private static final Object[] EMPTY_ELEMENTDATA = new Object[0];

3.ArrayList的add方法解析 每次扩容长度是上次长度的1.5倍

//ArrayList add 方法解析
public boolean add(E var1) {
        //判断当前数组是否需要扩容
        this.ensureCapacityInternal(this.size + 1);
        //将数据存入数组
        this.elementData[this.size++] = var1;
        return true;
    }

private void ensureCapacityInternal(int var1) {
        this.ensureExplicitCapacity(calculateCapacity(this.elementData, var1));
    }

private void ensureExplicitCapacity(int var1) {
        ++this.modCount;
        if (var1 - this.elementData.length > 0) {
            this.grow(var1);
        }

    }
//通过右移运算进行扩容
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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

guicai_guojia

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值