1. 程式人生 > >LinkedList和ArrayList在尾部插入資料效率對比

LinkedList和ArrayList在尾部插入資料效率對比

做這個實驗之前,我的猜想的是:因為每次都是在尾部插入資料,而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高了。