美文网首页
ArrayList的ensureCapacity()方法

ArrayList的ensureCapacity()方法

作者: 造一个大大的轮子 | 来源:发表于2019-11-20 17:25 被阅读0次

    ArrayList 源码中有一个 ensureCapacity 方法,这个方法显然是用做扩容用的,这个方法 ArrayList 内部没有被调用过,所以很显然是提供给用户调用的,那么这个方法有什么作用呢?

        /**
        如有必要,增加此 ArrayList 实例的容量,以确保它至少可以容纳由minimum capacity参数指定的元素数。
         *
         * @param   minCapacity   所需的最小容量
         */
        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);
            }
        }
    

    最好在 add 大量元素之前用 ensureCapacity 方法,以减少增量重新分配的次数

    通过下面的简单测试来看一下效果:

    public class EnsureCapacityTest {
        public static void main(String[] args) {
            ArrayList<Object> list = new ArrayList<Object>();
            final int N = 10000000;
            long startTime = System.currentTimeMillis();
            for (int i = 0; i < N; i++) {
                list.add(i);
            }
            long endTime = System.currentTimeMillis();
            System.out.println("使用ensureCapacity方法前:" + (endTime - startTime));
    
            list = new ArrayList<Object>();
            long startTime1 = System.currentTimeMillis();
            list.ensureCapacity(N);
            for (int i = 0; i < N; i++) {
                list.add(i);
            }
            long endTime1 = System.currentTimeMillis();
            System.out.println("使用ensureCapacity方法后:" + (endTime1 - startTime1));
        }
    }
    

    测试结果:
    使用ensureCapacity方法前:6337
    使用ensureCapacity方法后:938

    通过运行结果,我们可以很明显的看出向 ArrayList 添加大量元素之前最好先使用ensureCapacity 方法,以减少增量重新分配的次数

    推荐文章:
    ArrayList的扩容机制 作者:Snailclimb

    相关文章

      网友评论

          本文标题:ArrayList的ensureCapacity()方法

          本文链接:https://www.haomeiwen.com/subject/yxtaictx.html