每个ArrayList实例都有一个容量,该容量是指用来存储列表元素的数组的大小。它总是至少等于列表的大小。随着向ArrayList中不断添加元素,其容量也自动增长。自动增长会带来数据向新数组的重新拷贝(每当向数组中添加元素时,都要去检查添加后元素的个数是否会超出当前数组的长度,如果超出,数组将会进行扩容,以满足添加数据的需求,而每次数组容量的增长大约是其原容量的1.5倍),这种操作的代价是很高的,因此,如果可预知数据量的多少,可在构造ArrayList时指定其容量。在添加大量元素前,应用程序也可以使用ensureCapacity操作来增加ArrayList实例的容量,这可以减少递增式再分配的数量,从而可以大大提高初始化速度,测试代码如下:
package collection.list;
import java.util.ArrayList;
public class EnsureCapacityTest {
public static void main(String[] args) {
final int capacity = 5000000;Object obj = new Object();
// 没用调用ensureCapacity()方法初始化ArrayList对象
ArrayList list = new ArrayList();
long startTime = System.currentTimeMillis();
for (int i = 0; i < capacity; i++) {
list.add(obj);
}
long endTime = System.currentTimeMillis();
System.out.println("没有调用ensureCapacity()方法所用时间:" + (endTime - startTime) + "ms");// 调用ensureCapacity()方法初始化ArrayList对象
list = new ArrayList();
startTime = System.currentTimeMillis();
list.ensureCapacity(capacity);// 预先设置list大小(实际容量)
for (int i = 0; i < capacity; i++) {
list.add(obj);
}
endTime = System.currentTimeMillis();
System.out.println("调用ensureCapacity()方法所用时间:" + (endTime - startTime) + "ms");
}
}
输出结果:
没有调用ensureCapacity()方法所用时间:141ms
调用ensureCapacity()方法所用时间:47ms
可见在添加大量元素前,并且元素数量可预知的情况下,可以尽量使用ensureCapacity方法来指定ArrayList的大小,从而提高效率