轉載於:https://blog.csdn.net/qq_34144916/article/details/81154528
做這個實驗之前,我的猜想的是:因爲每次都是在尾部插入數據,而LinkedLiist裏面有一個last指針一直指向最後一個元素,而ArrayList則根據索引來找到最後一個元素,那麼,這兩個方式中,效率應該是差不多的;
但是實驗結果卻不是這樣的;
先看代碼:
package 源碼測試;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.Scanner;
public class arraylist_linkedlist {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
while(sc.hasNext()){
int num=sc.nextInt();
ArrayList alist=new ArrayList();
LinkedList llist=new LinkedList();
long startTime = System.currentTimeMillis(); //獲取開始時間
for(int i=0;i<num;i++){
alist.add(i);
} //測試的代碼段
long endTime = System.currentTimeMillis(); //獲取結束時間
System.out.println("ArrayList程序運行時間:" + (endTime - startTime) + "ms"); //輸出程序運行時間
long startTime1 = System.currentTimeMillis(); //獲取開始時間
for(int i=0;i<num;i++){
llist.add(i);
} //測試的代碼段
long endTime1 = System.currentTimeMillis(); //獲取結束時間
System.out.println("LinkedList程序運行時間:" + (endTime1 - startTime1) + "ms"); //輸出程序運行時間
}
}
}
當輸入的數據一直是小於千萬級別的時候,大部分是Linked效率高,後來翻開源碼,我猜想應該是當出現ArrayList擴容的時候,會效率降低,所以ArrayList的效益比較低。而當數據量大於千萬級別的時候,就會出現ArrayList的效率比較高了。爲什麼呢?
比較源碼:
原來 LinkedList每次增加的時候,會new 一個Node對象來存新增加的元素,所以當數據量小的時候,這個時間並不明顯,而ArrayList需要擴容,所以LinkedList的效率就會比較高,其中如果ArrayList出現不需要擴容的時候,那麼ArrayList的效率應該是比LinkedList高的,當數據量很大的時候,new對象的時間大於擴容的時間,那麼就會出現ArrayList'的效率比Linkedlist高了。
arraylist 默認初始容量爲 10 ,擴容機制 乘於 1.5 +1