2021-09-18

本文详细解析了ArrayList的内部实现原理,重点介绍了其在添加元素时的动态扩容机制及删除元素的具体过程。扩容通过计算老容量的1.5倍来确定新容量,并将老数组中的元素复制到新数组中;删除操作则涉及移动后续元素并释放被删除元素的空间。

ArrayList、LinkedList原理解析

ArrayList并非直接声明出固定大小的数组,供添加元素使用, 而是在添加元素的时候首先进行一次动态扩容;
1、ArrayList新增方法:
源码实现如下:

   private void ensureCapacityInternal(int minCapacity) { 
        //如果初始数组, 获取容量的最大值
        if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
            minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity);
        }
        //扩容
        ensureExplicitCapacity(minCapacity);
    }

   //扩容底层实现
   private void grow(int minCapacity) {
        //获取扩容前的元素个数
        int oldCapacity = elementData.length;
        //老容量的1.5倍的
        int newCapacity = oldCapacity + (oldCapacity >> 1);
        if (newCapacity - minCapacity < 0)
            newCapacity = minCapacity;
        if (newCapacity - MAX_ARRAY_SIZE > 0)
            newCapacity = hugeCapacity(minCapacity);
        //老的元素值拷贝到新数组中,完成扩容
        elementData = Arrays.copyOf(elementData, newCapacity);
    }

2、ArrayList删除方法:

    public E remove(int index) {
        rangeCheck(index);
        modCount++;
        E oldValue = elementData(index);
        int numMoved = size - index - 1;
        if (numMoved > 0)
        //数组中的元素进行拷贝
            System.arraycopy(elementData, index+1, elementData, index,  numMoved);
         //删除引用, 便于GC回收
        elementData[--size] = null; 
        return oldValue;
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值