java基础之:ArrayList的扩容机制(JDK1.8)?

java基础之:ArrayList的扩容机制(JDK1.8)?

要明确知道的是扩容机制是在往集合中添加元素时才会去触发的,所以我们从ArrayList的add方法开始跟进源码,观察源码可知,当add一个元素时,会依次调用add、ensureCapacityInternal、ensureExplicitCapacity、grow这四个主要方法,此图为方法调用的时序图,下面详细分析每个方法的作用:
在这里插入图片描述

add方法就两个重要操作,第一步,ensureCapacityInternal(size + 1)表示增加长度;第二步,elementData[size++] = e表示添加元素到数组,第二步没什么说的,下面分析一下ensureCapacityInternal(int minCapacity)方法。

    public boolean add(E e) {
        ensureCapacityInternal(size + 1);  // Increments modCount!!
        elementData[size++] = e;
        return true;
    }

ensureCapacityInternal调用了ensureExplicitCapacity,而ensureExplicitCapacity方法的参数为calculateCapacity方法的返回值,calculateCapacity方法表示如果在添加的时候原数组是空的,就直接给一个10的长度,否则的话就加1(因为minCapacity的值就是size+1)。

   private void ensureCapacityInternal(int minCapacity) {
        ensureExplicitCapacity(calculateCapacity(elementData, minCapacity));
    }
    private static int calculateCapacity(Object[] elementData, int minCapacity) {
        if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
            return Math.max(DEFAULT_CAPACITY, minCapacity);
        }
        return minCapacity;
    }

if (minCapacity - elementData.length > 0)表示当需要的长度大于原来数组长度的时候就需要扩容了,相反的则不需要扩容,扩容真正执行的方法为grow方法

    private void ensureExplicitCapacity(int minCapacity) {
        modCount++;

        // overflow-conscious code
        if (minCapacity - elementData.length > 0)
            grow(minCapacity);
    }

特别说明:int newCapacity = oldCapacity + (oldCapacity >> 1);
oldCapacity >> 1表示做右移运算(这里等价于oldCapacity/21),取原来长度的一半加上原长度,(1+0.5)倍原数组长度,即每次扩容是原来的1.5倍;之后就是把老数组copy到新数组中,至此完成扩容。

    private void grow(int minCapacity) {
        // overflow-conscious code
        int oldCapacity = elementData.length;
        int newCapacity = oldCapacity + (oldCapacity >> 1);
        if (newCapacity - minCapacity < 0)
            newCapacity = minCapacity;
        if (newCapacity - MAX_ARRAY_SIZE > 0)
            newCapacity = hugeCapacity(minCapacity);
        // minCapacity is usually close to size, so this is a win:
        elementData = Arrays.copyOf(elementData, newCapacity);
    }

最后先谢谢大家阅读!!!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值