关于Java的ArrayList数组自动扩容机制

ArrayList介绍

  • ArrayList底层是基于数组实现的,是一个动态数组,自动扩容。
  • ArrayList不是线程安全的,只能用在单线程环境下。
  • 实现了Serializable接口,因此它支持序列化,能够通过序列化传输;
  • 实现了RandomAccess接口,支持快速随机访问,实际上就是通过下标序号进行快速访问;
  • 实现了Cloneable接口,能被克隆。

动态扩容

  1. 初始容量
    private static final int DEFAULT_CAPACITY = 10;
    通过无参构造方法(初始长度默认10,以默认的大小来初始化内部的数组)、有参构造方法对数组进行初始化。
  2. 添加元素时的扩容
    • 每当向 ArrayList 中添加元素时,ArrayList 首先检查当前元素数量是否已经达到其内部数组的容量。
    • 如果当前元素数量等于内部数组的容量,ArrayList 将会进行扩容操作。
  3. 扩容策略
    private int newCapacity(int minCapacity) {
        // overflow-conscious code
        int oldCapacity = elementData.length;    //获取到ArrayList中的elementData数组的内存空间长度
        int newCapacity = oldCapacity + (oldCapacity >> 1);   //扩容至原来的1.5倍
        if (newCapacity - minCapacity <= 0) {
            if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA)
                return Math.max(DEFAULT_CAPACITY, minCapacity);
            if (minCapacity < 0) // overflow
                throw new OutOfMemoryError();
            return minCapacity;
        }
        return (newCapacity - MAX_ARRAY_SIZE <= 0)
            ? newCapacity
            : hugeCapacity(minCapacity);
    }
    • ArrayList 采用一种动态扩容的策略来增加其容量。通常情况下,ArrayList 的容量会以一种固定的增长因子进行扩展,这个增长因子通常为 1.5 倍(有时也可能是其他值,具体取决于 Java 的实现)。
    • 扩容时,ArrayList 会创建一个新的更大容量的数组,并将原始数组中的元素全部复制到新数组中。
  4. 影响性能的因素
    扩容操作的性能受到扩容时复制元素的数量影响。因此,在某些情况下,如果能够预先知道 ArrayList 大小的最大值,可以通过指定初始容量来减少扩容操作的频率,从而提高性能。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值