1. 程式人生 > >ArrayList和LinkedList的區別-完整總結

ArrayList和LinkedList的區別-完整總結

基於翻看各位前輩文章以及書籍的基礎上,分別從儲存元素的檢索、插入、刪除以及擴容的效能效率方面,比較完整的總結了ArrayList和LinkedList區別,使得更好應對苛刻面試官的提問。

1.ArrayList是實現了基於動態陣列的資料結構,每個元素在記憶體中儲存地址是連續的;LinkedList基於連結串列的資料結構,每個元素內容包擴previous, next, element(其中,previous是該節點的上一個節點,next是該節點的下一個節點,element是該節點所包含的值),也是由於這一性質支援了每個元素在記憶體中分佈儲存。

2.為了使得突破動態長度陣列而衍生的ArrayList初始容量為10,每次擴容會固定

為之前的1.5倍,所以當你ArrayList達到一定量之後會是一種很大的浪費,並且每次擴容的過程是內部複製陣列到新陣列;LinkedList的每一個元素都需要消耗一定的空間

3.對於每個元素的檢索,ArrayList要優於LinkedList。因為ArrayList從一定意義上來說,就是複雜的陣列,所以基於陣列index的  檢索效能顯然高於通過for迴圈來查詢每個元素的LinkedList。

4.元素插入刪除的效率對比,要視插入刪除的位置來分析,各有優劣

在列表首位新增(刪除)元素,LnkedList效能遠遠優於ArrayList,原因在於ArrayList要後移(前移)每個元素的索引和陣列擴容(刪除元素時則不需要擴容)。(測試的時候當然插入一次是看不出來什麼的,我自己測試插入十萬次,就會有陣列擴容arraycopy的因素)而LinkedList則直接增加元素,修改原第一元素該節點的上一個節點即可,刪除同理

在列表中間位置新增(刪除)元素,總的來說位置靠前則LnkedList效能優於ArrayList,靠後則相反。出現這種情況的原因在於ArrayList效能主要損耗在後移(前移)該位置之後的元素索引,而LinkedList損耗在for迴圈從第一位檢索該位置的元素。這個效能反轉的臨界點不固定,我自己測試插入十萬次,在15000次左右損耗時間相比出現變化

在列表末尾位置新增(刪除)元素,效能相差不大。

附上我的測試程式:

public static void main(String[] args){

        List<Object> a = new ArrayList<Object>();
        LinkedList<Object>b = new LinkedList<Object>();
        int i;
        for(i=0;i<100000;i++)
        {
            a.add(i,i);
        }
        for(i=0;i<100000;i++)
        {
            b.add(i,i);
        }
        long aTime1= System.currentTimeMillis();
        for(i=0;i<100000;i++)
        {
            a.remove(99999-i);
        }
        long aTime2= System.currentTimeMillis();
        long bTime1= System.currentTimeMillis();
        for(i=0;i<100000;i++)
        {
            b.remove(99999-i);
        }
        long bTime2= System.currentTimeMillis();
        System.out.println("aTime:"+(aTime2-aTime1)+"bTime"+(bTime2-bTime1));

}

有錯誤的地方歡迎指正!

參考文獻:

http://blog.csdn.net/langjian2012/article/details/45039349

http://blog.csdn.net/eson_15/article/details/51145788