1. 程式人生 > >ArrayList初始容量對效能的影響

ArrayList初始容量對效能的影響

package testList;

import java.util.ArrayList;

public class TestLArrayList {

	public static void main(String[] args) {
		System.out.println("測試10000000條資料的add操作");
		System.out.println("預設容量耗時:"+testContent(10000000));
//		System.out.println("初始容量為10000耗時:"+testContent(10000,10000000));
//		System.out.println("初始容量為100000耗時:"+testContent(100000,10000000));
//		System.out.println("初始容量為1000000耗時:"+testContent(1000000,10000000));
		System.out.println("初始容量為10000000耗時:"+testContent(10000000,10000000));
//		System.out.println("初始容量為20000000耗時:"+testContent(20000000,10000000));
	}
	
	/**
	 * 測試ArrayList初始容量對新增物件效能的影響
	 * @param number 新增物件數量
	 * @return
	 */
	private static Long testContent(int number){
		ArrayList<Test> list1=new ArrayList<Test>();
		Long start=System.currentTimeMillis();
		for(int i=0;i<number;i++){
			list1.add(new Test(i));
		}
		long end=System.currentTimeMillis();
		return (end-start);
	}
	
	/**
	 * 測試ArrayList初始容量對ArrayList新增物件效能的影響
	 * @param size 初始容量
	 * @param number 新增物件數量
	 * @return
	 */
	private static Long testContent(int size,int number){
		ArrayList<Test> list1=new ArrayList<Test>(size);
		Long start=System.currentTimeMillis();
		for(int i=0;i<number;i++){
			list1.add(new Test(i));
		}
		long end=System.currentTimeMillis();
		return (end-start);
	}

}
class Test{
	private int i;
	public Test(int i){
		this.i=i;
	}
}

測試10000000條資料的add操作
預設容量耗時:2866
初始容量為10000耗時:2515
初始容量為100000耗時:2413
初始容量為1000000耗時:2286
初始容量為10000000耗時:935
初始容量為20000000耗時:2490

結果:ArrayList在每次增加元素時,都要呼叫該方法來確保足夠的容量。當容量不足以容納當前的元素個數時,就設定新的容量為舊的容量的1.5倍加1,如果設定後的新容量還不夠,則直接新容量設定為傳入的引數(也就是所需的容量),而後用Arrays.copyof()方法將元素拷貝到新的陣列。從中可以看出,當容量不夠時,每次增加元素,都要將原來的元素拷貝到一個新的陣列中,非常之耗時,但也不能把ArrayList的初始容量開得太大,這樣也很耗時的。因此建議在事先能確定元素數量的情況下,才使用ArrayList。