arrayList扩容内部是怎么实现的

1、查看ArrayList的add方法,场景假设,一个list长度是10,目前有5个元素

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

size是目前的元素个数等于5。ensureCapacityInternal(size + 1)进行判断是否有增加1个元素的空间。

2、进行判断,目前minCapacity=6.elementData是此时的数组。

    private void ensureCapacityInternal(int minCapacity) {
        ensureExplicitCapacity(calculateCapacity(elementData, minCapacity));
    }

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

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

如果增加元素后的数组长度比数组长度大,就进行扩容。

3、扩容原来数组长度的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);
    }

 

 

你可能感兴趣的:(java基础)