ArrayList自动扩容机制

1-自动扩容机制?

ArrayList是基于数组实现的,其底层实现是一个Object类型的数组。当创建一个ArrayList时,底层会创建一个初始容量为10的Object数组,如果添加的元素个数超过了初始容量,则自动扩容。

ArrayList的自动扩容机制是通过调用ensureCapacityInternal方法实现的。在添加元素时,首先会判断当前数组容量是否足够,如果不足够则会调用该方法进行扩容。该方法会计算出扩容后的容量大小,然后创建一个新的数组,并将原来的元素复制到新数组中。这个过程涉及到数组的拷贝,因此扩容的成本比较高。

ArrayList的扩容机制是按照一定比例进行扩容的,默认情况下,扩容比例是原来容量的一半。在添加元素时,如果原来的容量为n,最后一次扩容的容量为m,则下一次扩容的容量为n+m/2。

总之,ArrayList的自动扩容机制可以保证在元素数量超过初始容量时,仍然可以正常添加元素,但是扩容的过程会影响性能,因此在设计时需要合理考虑容量的设置及元素的添加方式。

注意⚠️在 JDK 1.8 版本之前,ArrayList 的自动扩容大小是原来容量的一半,而在 JDK 1.8 版本及以后,自动扩容大小改为容量的四分之一。

 

2-如何尽可能避免扩容带来的性能影响?

1. 初始化时设置合适的初始容量。在创建ArrayList时,可以通过构造函数设置初始容量,避免在添加元素时进行不必要的扩容,例如:`ArrayList<Integer> list = new ArrayList<>(100);`

2. 手动控制添加元素的数量。在添加元素时,可以通过调用`trimToSize()`方法手动控制ArrayList的容量,将多余的空间去掉,例如:`list.trimToSize();`

3. 批量添加元素。在添加多个元素时,可以通过调用`addAll()`方法批量添加,避免单个添加带来的频繁扩容问题,例如:`list.addAll(anotherList);`

总之,合理控制ArrayList的容量,可以避免不必要的扩容,从而提高程序的性能。

 

3-如何缩小扩容机制?

在Java的ArrayList中,自动扩容大小的默认值是原来的一半,这个值是通过计算得出的,我们没有办法直接改变它。如果要改变自动扩容的大小,我们可以创建一个新的ArrayList类,并重写它的扩容方法,在这个方法中,我们可以指定ArrayList自动扩容的大小。例如,我们可以将扩容大小设置为原来的大小3/4来达到我们的需求。但是,需要注意的是,这可能会降低ArrayList在添加元素时的性能

public class CustomArrayList<E> extends ArrayList<E> {

    @Override
    public void ensureCapacity(int minCapacity) {
        // 获取当前 ArrayList 的大小
        int currentSize = size();
        // 计算新的最小容量
        int newCapacity = currentSize + minCapacity;
        // 计算新的扩容大小
        int minExpansion = currentSize - (currentSize >> 2); // 相当于 currentSize * 0.75
        if (newCapacity > minExpansion) { // 如果新的最小容量超过了新的扩容大小,就以新的最小容量为准
            newCapacity = minExpansion;
        }
        // 调用父类的 ensureCapacity 方法进行扩容
        super.ensureCapacity(newCapacity);
    }
}

 

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值