ArrayList和LinkedList的區別

一般大家都知道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。
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條數據的試驗。

        long time1 = new Date().getTime();
        String s1 = (String) linkedlist.get(100000);//  總記錄200000,linkedlist加載第100000條數據耗時15~32ms不等
        long time2 = new Date().getTime();
        System.out.println(time2 - time1);
        String s2 = (String) arraylist.get(100000);//  總記錄200000,linkedlist加載第100000條數據耗時0ms
        long time3 = new Date().getTime();
        System.out.println(time3 - time2);

 

    /*分別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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章