ArrayList底层源码简单了解

1、ArrayList的底层实际上是一个Object数组,我们可以看到它的空参构造方法是把Object数组指向了一个长度为0的Object数组。


private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = new Object[0];
    transient Object[] elementData;

public ArrayList() {
        this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
    }

2、此时数组的大小为0,需要第一次添加元素后进行扩容,this.ensureCapacityInternal(this.size + 1);这个方法是用来判断是否需要进行扩容,size是一个int型成员变量,初始时为0,size代表了没有添加前当前数组所含元素的个数,size+1代表如果添加后的元素个数


private int size;

public boolean add(E var1) {
        this.ensureCapacityInternal(this.size + 1);
        this.elementData[this.size++] = var1;
        return true;

   }

3、在这里进行了一个if判断,构造方法中是将elementData 指向了DEFAULTCAPACITY_EMPTY_ELEMENTDATA这个的,就是判断是否是第一次扩容,因为扩容之后的数组都会是一个新的地址,第一次扩容大小为10,否则传递的参数为上文中的size+1,即添加后的元素个数

private void ensureCapacityInternal(int var1) {
        if (this.elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
            var1 = Math.max(10, var1);
        }

        this.ensureExplicitCapacity(var1);
    }

4、这里就是是否需要扩容的判断了,如果传递过来的元素个数大于elementData数组的长度的话就要调用grow方法进行扩容,modCount这里不做详解。

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

    }

5、var2为数组未添加前长度,var3为扩大1.5倍后的长度,这两个if是用来防止扩容后过大或过小的,第一个if主要是为了第一次扩容的时候使用,最后通过Arrays.copyOf(this.elementData, var3);返回一个包含原先数组元素和原先数组大小1.5倍的数组

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);
    }

6、最后返回到add方法中,this.elementData[this.size++] = var1;赋值,因为下标从0开始,所以此处++在右边,后计算。

学艺不精,仅供参考,有错误请指出

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值