1、ArrayList原理
ArrayList底層使用可變長度數組存儲元素
在初始化ArrayList時,如果沒有指定初始化容量或者指定0爲初始化容量,那初始化容量將默認爲10
在每次添加元素時,首先校驗容量是否滿足,如果不滿足使用Arrays.copyOf方法,以原來容量的1.5倍擴容
涉及到內存操作(創建新的數組,丟掉老的數組)導致效率比較低
在每次刪除元素時,使用Arrays.copyOf方法,將要刪除元素之後的所有元素的索引減一,最後一位置位NULL,和添加同理,涉及到內存操作,效率比較低
2、初始化ArrayList時指定初始化容量實驗
實驗代碼
@Test
public void test04(){
loadData(0,1000);
loadData(1000,1000);
System.out.println("---------------------------");
loadData(0,10000);
loadData(10000,10000);
System.out.println("---------------------------");
loadData(0,100000);
loadData(100000,100000);
System.out.println("---------------------------");
loadData(0,1000000);
loadData(1000000,1000000);
System.out.println("---------------------------");
loadData(0,10000000);
loadData(10000000,10000000);
}
public static void loadData(int initCapacity,int loopNum){
Long start = System.currentTimeMillis();
List list = new ArrayList(initCapacity);
for(int i = 0 ; i < loopNum ; i ++){
list.add(i);
}
Long end = System.currentTimeMillis();
System.out.println("初始化容量:" + initCapacity + "\t 循環次數:" + loopNum + "\t用時:" + (end - start));
}
結果1
結果2
結果3
從以上3個結果可以看出,在集合容量達到10萬到100萬之間,指定初始化容量效率有明顯提升,大事達到1000萬時,指定初始化容量效率就下降了,不知道爲啥,等待大佬評論,感謝。