通常你們都知道ArrayList和LinkedList的大體區別:
1.ArrayList是實現了基於動態數組的數據結構,LinkedList基於鏈表的數據結構。
2.對於隨機訪問get和set,ArrayList以爲優於LinkedList,由於LinkedList要移動指針。
3.對於新增和刪除操做add和remove,LinedList比較佔優點,由於ArrayList要移動數據。
這一點要看實際狀況的。若只對單條數據插入或刪除,ArrayList的速度反而優於 LinkedList。但如果批量隨機的插入刪除數據,LinkedList的速度大大優於ArrayList. 由於ArrayList每插入一條數據,要移動插入點及以後的全部數據。 這一點我作了實驗。在分別有200000條「記錄」的ArrayList和LinkedList的首位插入20000條數據,LinkedList耗時約 是ArrayList的20分之1。java
for(int m=0;m<20000;m++){
linkedlist.add(m,null); //當在200000條數據以前插入20000條數據時,LinkedList只用了1125多ms.這就是LinkedList的優點所在
} long time4 = new Dte().getTime();
System.out.print("batch linkedlist add:");
System.out.println(time4 - time3);
for(int n=0;n<20000;n++){
arraylist.add(n, null); //當在200000條數據以前插入20000條數據時,ArrayList用了18375多ms.時間花費是arraylist的近20倍(視測試時機器性能)
} long time5 = new Date().getTime();
System.out.print("batch arraylist add:");
System.out.println(time5 - time4);數組
4.查找操做indexOf,lastIndexOf,contains等,二者差很少。
5.隨機查找指定節點的操做get,ArrayList速度要快於LinkedList.
這裏只是理論上分析,事實上也不必定,ArrayList在末尾插入和刪除數據的話,速度反而比LinkedList要快。我作過一個插入和刪除200000條數據的試驗。數據結構
/*分別insert200000條數據到linkedlist和arraylist *因爲是在末尾插入數據,arraylist的速度比linkedlist的速度反而要快 */ public static void insertList(LinkedList linklist, ArrayList arraylist) { long time1 = new Date().getTime(); System.out.println(time1); for (int i = 0; i < 200000; i++) { linklist.add(i, "linklist" + i); } long time2 = new Date().getTime(); System.out.println(time2 - time1); for (int j = 0; j < 200000; j++) { arraylist.add(j, "arraylist" + j); } long time3 = new Date().getTime(); System.out.println(time3 - time2); } /*delete linkedlist和arraylist中的200000條數據 *因爲是在末尾刪除數據,arraylist的速度比linkedlist的速度反而要快 */ public static void deleteList(LinkedList linklist, ArrayList arraylist) { long time1 = new Date().getTime(); System.out.println(time1); for (int i = 199999; i >= 0; i--) { linklist.remove(i); } long time2 = new Date().getTime(); System.out.println(time2 - time1); for (int j = 199999; j >= 0; j--) { arraylist.remove(j); } long time3 = new Date().getTime(); System.out.println(time3 - time2); } public static void main(String args[]) { LinkedList linkedlist = new LinkedList(); ArrayList arraylist = new ArrayList(); insertList(linkedlist, arraylist); //如下代碼省略
插入:
LinkedList 578ms
ArrayList 437ms
刪除:
LinkedList 31ms
ArrayList 16ms性能