比较ArrayList两种扩容方式

ArrayList容量问题

1.普通方式:按照1.5倍扩增(多次)。
2.ensureCapacity一次性扩增。

首先有一个计算时间的抽象类

package com.u1.arraylist;

/**
 * 计算一个程序的运行时间
 */
public abstract class GetTime {
    /**
     * 可以让一个子类去继承这个GetTime类,重写program方法。然后直接调用getTime方法即可。
     * 此方法只考虑了相对的程序的“相同环境下”,没有考虑它自身的运行时间的误差。
     */
    public abstract void program1();

    public void program2() {// 当需要计算第二块程序的运行花费时间时可以用到它。
    }

    // 获取某一程序program1时间
    final void getTime1() {
        long startTime = System.currentTimeMillis();
        program1();
        long endTime = System.currentTimeMillis();
        System.out.println("程序运行时间是:" + (endTime - startTime));
    }

    // 获取某一程序program2时间
    final void getTime2() {
        long startTime = System.currentTimeMillis();
        program2();
        long endTime = System.currentTimeMillis();
        System.out.println("程序运行时间是:" + (endTime - startTime));
    }
}

该类不允许修改getTime方法,但是可以让子类重写program1或program2方法。

实现类ArrayListDemo

用来继承GetTime类,作为它的实现类来重写和调用其中获得运行时间的方法。

package com.u1.arraylist;

import java.util.ArrayList;

/**
 * 这个例子主要是想看看ArrayList中的ensureCapacity方法 如有必要,增加此 ArrayList
 * 实例的容量,以确保它至少能够容纳最小容量参数所指定的元素数。
 * 
 * @author Feng 2018年2月5日上午11:48:45
 */
public class ArrayListDemo extends GetTime {

    final static int counts = 10000000;

    /**
     * 用效率来说明一切。ensureCapacity使用的必要性,可以提升性能。 因为ArrayList增加其容量时是当超过当前容量才会以1.5倍扩容。
     * 但是,你要是一次性就把容量扩充到了你所需要的最大值的时候,就不用再一次次的去1.5的扩容了。
     */
    public static void main(String[] args) {
        // 普通的扩容。
        GetTime gt1 = new ArrayListDemo();
        gt1.getTime1();
        System.out.println("========================================");
        // 直接用ensureCapacity括容到最大值。
        GetTime gt2 = new ArrayListDemo();
        gt2.getTime2();

    }

    @Override
    public void program1() {
        // TODO Auto-generated method stub
        ArrayList list1 = new ArrayList();
        for (int i = 0; i < counts; i++) {
            list1.add("我真帅");
        }
    }

    @Override
    public void program2() {
        // TODO Auto-generated method stub
        ArrayList list2 = new ArrayList();
        list2.ensureCapacity(counts);// 直接扩容到最大值 counts。
        for (int i = 0; i < counts; i++) {
            list2.add("我真帅");
        }
    }

}

程序运行结果

比较ArrayList两种扩容方式_第1张图片

可以比较清楚的看到,用了ensureCapacity之后,运行时间明显缩小了,因为它不需要一直去开辟空间了,我们给它一次性开辟了一个此次运行的最大值的空间大小,就一直添加就行了。

你可能感兴趣的:(java基础学习,java核心基础的接触性学习)