ArrayLis中的一个方法ensureCapacity(int n),该方法可以对ArrayList低层的数组进行扩容,显示的调用这个函数,如果参数大于低层数组长度的1.5倍,那么这个数组的容量就会被扩容到这个参数值,如果参数小于低层数组长度的1.5倍,那么这个容量就会被扩容到低层数组长度的1.5倍。
简单说就是 数组有个当前值 给定一个参数 参数比当前值的1.5倍还要大,那么就扩大当前倍数,反之,只扩大1.5倍。(就是我现在知道了数组大概需要存放多少个数值,我先直接给它一定的空间)(而不是等到数组满了在进行慢慢扩容)
相比数组满了之后慢慢扩容(包含数值的拷贝)效率大大提高。
拷贝了一段代码供大家对比。
public static void main(String[] args) {
final int N=1000000;
Object obj=new Object();
ArrayList list1=new ArrayList();
long start=System.currentTimeMillis();
for(int i=0;i<N;i++){
list1.add(obj);
}
System.out.println(System.currentTimeMillis()-start);
ArrayList list2=new ArrayList();
long start2=System.currentTimeMillis();
list2.ensureCapacity(N);//对低层数组进行扩容
for(int i=0;i<N;i++){
list2.add(obj);
}
System.out.println(System.currentTimeMillis()-start2);
}
比较两次的输出结果,可以发现 执行时间 差很多。