ArrayList -- 使用ensureCapacity()在不知道数据多少的情况 提高扩容效率

一、ensureCapacity()方法是什么?

ensureCapacity()是 ArrayList 源码中的方法,是提供给用户调用的


二、ensureCapacity()方法能做什么?

  1. 在 ArrayList.add操作 大量元素之前用 ensureCapacity 方法,以减少 增量重新分配1的次数。
  2. 自定义扩容倍数(默认是1.5倍),这是我推理出的作用(仅供讨论)

三、分析推理过程

首先减少增量重新分配的方法我所知的有两种:

  1. new ArrayList(初始化容量)初始化容量
  2. ensureCapacity方法

两种方法执行add后的效率差不多,初始化容量的效果好像略好点。
然而 !
ensureCapacity方法的优点在于可以多次定义ArrayList数组容量
因为
ensureCapacity方法源码里 就执行了grow方法(ArrayList扩容核心方法)。

ensureCapacity方法源码:

 public void ensureCapacity(int minCapacity) {
        int minExpand = (elementData != DEFAULTCAPACITY_EMPTY_ELEMENTDATA)
            // any size if not default element table
            ? 0
            // larger than default for default empty table. It's already
            // supposed to be at default size.
            : DEFAULT_CAPACITY;

        if (minCapacity > minExpand) {
            ensureExplicitCapacity(minCapacity);
        }
    }
    
 private void ensureExplicitCapacity(int minCapacity) {
        modCount++;

        // overflow-conscious code
        if (minCapacity - elementData.length > 0)
        // ArrayList扩容核心方法
            grow(minCapacity);
    }

四、结论

以上是知道要add多少条数据的情况,但实际开发过程中不知道数据多少的情况 又想效率高怎么办呢?

  • 使用ensureCapacity()方法在每次新增大量数据前,自定义提升数组容量

  • 没必要默认1.5倍提升,你可以根据实际情况,自定义一个更高的倍数


  1. 增量重新分配: 简单理解就是 ArrayList扩容操作,但每次操作都是全量拷贝操作,消耗资源,影响执行效率↩︎


版权声明:本文为qq_24283811原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。