1. 程式人生 > >ArrayList和LinkedList的各項操作效能比較

ArrayList和LinkedList的各項操作效能比較

      如果用java編寫程式,我們通常儲存易變的資料集合時用到的資料結構往往是ArrayList,不過,在JDK中還存在另一個結構--LinkedList,只不過我們通常不用,原因在於效能問題,下面,我就以一個問題來分析下這兩個結構的效能差別。

問題:

自己編寫一個測試程式,測試驗證ArrayList和LinkedList在做增、刪、改、遍歷等操作上的效能差異。

首先,我先給出ArrayList的測試類:

package com.brucezhang.arraylinkedtest;

import java.util.ArrayList;

public class My_ArrayList_Test {

	//定義迴圈次數常量
	private static final int count = 100000;
	//定義ArrayList
	private ArrayList<Integer> my_array = new ArrayList<Integer>();
	
	//存資料進ArrayList--增
	public void addToArray() {
		long begin = System.currentTimeMillis();
		for(int i = 0; i < count; i++){
			my_array.add(i);
		}
		long over = System.currentTimeMillis();
		System.out.println(" 操作 " + "ArrayList.add()方法需要的時間是:"
				+ (over - begin) + " 毫秒 ");
	}
	
	//刪除資料從ArrayList--刪
	public void delFromArray() {
		long begin = System.currentTimeMillis();
		for(int i = 0; i < my_array.size(); i++){
			my_array.remove(i);
		}
		long over = System.currentTimeMillis();
		System.out.println(" 操作 " + "ArrayList.remove()方法需要的時間是:"
				+ (over - begin) + " 毫秒 ");
	}
	
	//修改ArrayList中的資料--改
	public void updateArray() {
		long begin = System.currentTimeMillis();
		for(int i = 0; i < my_array.size(); i++){
			my_array.set(i, i+1);
		}
		long over = System.currentTimeMillis();
		System.out.println(" 操作 " + "ArrayList.set()方法需要的時間是:"
				+ (over - begin) + " 毫秒 ");
	}
	
	//查詢ArrayList中的資料--查
	public void selFromArray() {
		long begin = System.currentTimeMillis();
		for(int i = 0; i < my_array.size(); i++){
			my_array.get(i);
		}
		long over = System.currentTimeMillis();
		System.out.println(" 操作 " + "ArrayList.get()方法需要的時間是:"
				+ (over - begin) + " 毫秒 ");
	}
}

下面,給出的是LinkedList的測試類:
package com.brucezhang.arraylinkedtest;

import java.util.LinkedList;

public class My_LinkedList_Test {

	//定義迴圈次數常量
	private static final int count = 100000;
	
	//定義LinkedList
	private LinkedList<Integer> my_link = new LinkedList<Integer>();
	
	//存入資料進LinkedList--增
	public void addToLink() {
		long begin = System.currentTimeMillis();
		for(int i = 0; i < count; i++){
			my_link.add(i);
		}
		long over = System.currentTimeMillis();
		System.out.println(" 操作 " + "LinkedList.add()方法需要的時間是:"
				+ (over - begin) + " 毫秒 ");
	}
	
	//刪除資料從LinkedList--刪
	public void delFromLink() {
		long begin = System.currentTimeMillis();
		for(int i = 0; i < my_link.size(); i++){
			my_link.remove(i);
		}
		long over = System.currentTimeMillis();
		System.out.println(" 操作 " + "LinkedList.remove()方法需要的時間是:"
				+ (over - begin) + " 毫秒 ");
	}
	
	//修改LinkedList中的資料--改
	public void updateLink() {
		long begin = System.currentTimeMillis();
		for(int i = 0; i < my_link.size(); i++){
			my_link.set(i, i+1);
		}
		long over = System.currentTimeMillis();
		System.out.println(" 操作 " + "LinkedList.set()方法需要的時間是:"
				+ (over - begin) + " 毫秒 ");
	}
	
	//查詢LinkedList中的資料--查
	public void selFromLink() {
		long begin = System.currentTimeMillis();
		for(int i = 0; i < my_link.size(); i++){
			my_link.get(i);
		}
		long over = System.currentTimeMillis();
		System.out.println(" 操作 " + "LinkedList.get()方法需要的時間是:"
				+ (over - begin) + " 毫秒 ");
	}
}

好了,最後給出主測試程式:
package com.brucezhang.arraylinkedtest;

public class Main_Class {

	/**
	 * @param args
	 * Author:DlutBruceZhang
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub

		//測試ArrayList的各項操作
		ArrayTest();
		
		//測試LinkedList的各項操作
		LinkTest();
	}
	
	public static void ArrayTest(){
		System.out.println("--------------------------------------------------");
		My_ArrayList_Test arrayTest = new My_ArrayList_Test();
		arrayTest.addToArray();
		arrayTest.updateArray();
		arrayTest.selFromArray();
		arrayTest.delFromArray();
		System.out.println("--------------------------------------------------");
	}
	
	public static void LinkTest(){
		System.out.println("--------------------------------------------------");
		My_LinkedList_Test linkTest = new My_LinkedList_Test();
		linkTest.addToLink();
		linkTest.updateLink();
		linkTest.selFromLink();
		linkTest.delFromLink();
		System.out.println("--------------------------------------------------");
	}

}

測試的結果如下所示:
--------------------------------------------------
 操作 ArrayList.add()方法需要的時間是:9 毫秒 
 操作 ArrayList.set()方法需要的時間是:7 毫秒 
 操作 ArrayList.get()方法需要的時間是:4 毫秒 
 操作 ArrayList.remove()方法需要的時間是:1311 毫秒 
--------------------------------------------------
--------------------------------------------------
 操作 LinkedList.add()方法需要的時間是:9 毫秒 
 操作 LinkedList.set()方法需要的時間是:8715 毫秒 
 操作 LinkedList.get()方法需要的時間是:8700 毫秒 
 操作 LinkedList.remove()方法需要的時間是:6672 毫秒 
--------------------------------------------------

由結果我們可以得出結論:

1.兩個結構在儲存資料方面所用時間沒有太大的區別

2.兩個結構在更改,查詢,刪除結構中的資料時效能差別“巨大”,且ArrayList優於LinkedList很多,明顯不是在一個數量級上