ArrayList和LinkedList的各項操作效能比較
阿新 • • 發佈:2019-01-10
如果用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很多,明顯不是在一個數量級上