ArrayList初始容量對效能的影響
阿新 • • 發佈:2019-01-10
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。