Java ArrayList 扩容讲解

        

package ArrayListImprove20240724;
import java.util.ArrayList;
import java.util.List;
public class ArrayListImprove {
    public static void main(String[] args) {
        List<Integer> arraylist = new ArrayList<>();
        // 创建一个ArrayList对象时,底层先创建了一个长度为0的数组
        // elementDate,创建变量size
        // size有两个作用:集合的长度(元素的个数)和下一个元素应该添加的位置
        arraylist.add(5);
        /* 添加一个元素其实有点复杂:如果现在的size≠数组的长度(数组没有存满),则
        直接在size所指的位置添加元素,然后size++
        但是若size=数组的长度(相当于已经存满了),那么就会调用ArrayList中的grow方法,先对数组进行扩容
        然后再存入元素*/

        /* 数组扩容的原理:第一次添加元素的时候,数组长度是0,会用grow进行扩容,这时的扩容长度是10(设定的第一次扩容10),
        但是当10个元素存满之后,想要添加第11个元素,也会进行grow扩容,此刻算出至少需要扩容的长度是1,然后grow方法中
        可以计算出需要扩容1,然后grow有个默认扩容机制——将老容量左移1位作为扩容的大小,当需要扩容的大小小于默认扩容机制的时候,
        将使用默认的扩容机制扩容——新数组是原来的1.5倍(长度是原来的1.5倍);但是当需要扩容的长度大于了默认扩容的长度,
        则以实际的长度为准 */
        /* 举个例子:当默认长度位10的数组已经存满了,再想存元素,按理来说默认的扩容是将10扩容为15,但是假如想一次添加100个
        元素,15显然不够,这时就会以实际需要添加的元素为准,将其扩容为长度为110的数组,而不是默认的1.5倍长度的15的数组 */

    }
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ArrayListJava中常用的动态数组实现类,它可以自动扩容以容纳更多的元素。下面我们来看一下ArrayList扩容源码。 首先,ArrayList内部维护了一个数组elementData,用于存储元素。当我们向ArrayList中添加元素时,如果元素个数已经达到了数组的容量,就需要对数组进行扩容。下面是ArrayList扩容的核心代码: ```java private void ensureCapacityInternal(int minCapacity) { if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) { minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity); } ensureExplicitCapacity(minCapacity); } private void ensureExplicitCapacity(int minCapacity) { modCount++; if (minCapacity - elementData.length > 0) grow(minCapacity); } private void grow(int minCapacity) { int oldCapacity = elementData.length; 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); } ``` 在ensureCapacityInternal方法中,首先判断当前的elementData是否是默认空数组,如果是,则将minCapacity与默认容量DEFAULT_CAPACITY取最大值。这是因为默认空数组的容量为0,如果minCapacity小于DEFAULT_CAPACITY,就会直接使用默认容量。如果不是默认空数组,则直接调用ensureExplicitCapacity方法。 在ensureExplicitCapacity方法中,首先将modCount加1,表示对ArrayList进行了一次修改。然后判断需要扩容的最小容量是否大于当前数组的容量,如果是,就调用grow方法进行扩容。 在grow方法中,首先将当前数组的容量oldCapacity扩大1.5倍,得到新的容量newCapacity。然后判断新容量是否小于需要的最小容量,如果是,就将新容量设置为需要的最小容量。最后再判断新容量是否超过最大数组容量MAX_ARRAY_SIZE,如果超过,就调用hugeCapacity方法抛出异常。 最后,通过调用Arrays.copyOf方法将原数组elementData复制到新数组中,完成扩容。 总体来说,ArrayList扩容过程就是先判断是否需要扩容,然后计算新容量,最后将原数组复制到新数组中。需要注意的是,ArrayList扩容策略是每次扩容1.5倍,而不是每次扩容一个固定的值。这是因为这种策略可以在大多数情况下减少扩容次数,提高性能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值