1. 程式人生 > >四、ArrayList和LinkedList內部的實現大致是怎樣的?

四、ArrayList和LinkedList內部的實現大致是怎樣的?


 1、ArrayList集合
     ArrayList是List介面的一個實現類,它是程式中最常見的一種集合。在ArrayList內部封裝了一個長度可變的陣列物件,當存入的元素超過陣列長度時,ArrayList會在記憶體分配一個更大的陣列來儲存這些元素,因此ArrayList集合看做一個長度可變的陣列。
 2、LinkedList集合
     LinkedList是List介面的另一個實現類。該集合內部維護了一個雙向迴圈連結串列,連結串列中的每一個元素都使用引用的方式來記住它的前一個元素和後一個元素。
  
 3、時間複雜度
        //get方法兩者之間的對比
        package com.jqka;


        import java.util.LinkedList;  
        import java.util.List;  
        import java.util.Random;  
        import java.util.ArrayList;  
        import java.util.Arrays;  
        import java.util.Collections; 
        public class ListTest{      
            public static final int N=50000;      
            public static List values;      
            static{           
                Integer vals[]=new Integer[N];          
                Random r=new Random();          
                for(int i=0,currval=0;i<N;i++){               
                    vals[i]=new Integer(currval);              
                    currval+=r.nextInt(100)+1;     //隨機生成1~100之間的整數      
                    }          
                values=Arrays.asList(vals);//將一個數組轉化為一個List物件       
                }      
            static long timeList(List lst){           
                long start=System.currentTimeMillis();           
                for(int i=0;i<N;i++){               
                    int index=Collections.binarySearch(lst, values.get(i));  
                    if(index!=i)                   
                        System.out.println("***錯誤***");           
                    }           
                return System.currentTimeMillis()-start;       
                }       
            public static void main(String args[]){           
                System.out.println("ArrayList消耗時間:"+timeList(new ArrayList(values)));          
                System.out.println("LinkedList消耗時間:"+timeList(new LinkedList(values)));       
                }  
            }


    執行結果:
        ArrayList消耗時間:11
        LinkedList消耗時間:3842


        //add方法兩者之間的對比
        package com.jqka;


        import java.util.ArrayList;
        import java.util.LinkedList;
        import java.util.List;


        public class ListDemo {       
            static final int N=50000;       
            static long timeList(List list){       
                long start=System.currentTimeMillis();      
                Object o = new Object();       
                for(int i=0;i<N;i++)           
                    list.add(0, o);       
                return System.currentTimeMillis()-start;       
                }       
        public static void main(String[] args) {          
                System.out.println("ArrayList耗時:"+timeList(new ArrayList()));          
                
                System.out.println("LinkedList耗時:"+timeList(new LinkedList()));       }  }
    執行結果:
        ArrayList耗時:189
        LinkedList耗時:4
總結:
      1、ArrayList是實現了基於動態陣列的資料結構,LinkedList基於連結串列的資料結構。
      2、由於陣列的結構允許程式通過索引的方式來訪問元素,因此,對於隨機訪問get和set,ArrayList優於LinkedList,ArrayList可以隨機定位,而LinkedList要移動指標一步一步到節點處。
      3、對於add和remove,LinkedList就比較佔優勢,只需要對指標進行修改即可,而ArrayList要移動資料來填補被刪除的空間。