Java中ArrayList和LinkedList區別

sunjiaminaini發表於2017-08-08

一般大家都知道ArrayList和LinkedList的大致區別:
1.ArrayList是實現了基於動態陣列的資料結構,LinkedList基於連結串列的資料結構。
2.對於隨機訪問get和set,ArrayList覺得優於LinkedList,因為LinkedList要移動指標。
3.對於新增和刪除操作add和remove,LinedList比較佔優勢,因為ArrayList要移動資料。

ArrayList和LinkedList是兩個集合類,用於儲存一系列的物件引用(references)。例如我們可以用ArrayList來儲存一系列的String或者Integer。那麼ArrayList和LinkedList在效能上有什麼差別呢?什麼時候應該用ArrayList什麼時候又該用LinkedList呢?
一.時間複雜度
首先一點關鍵的是,ArrayList的內部實現是基於基礎的物件陣列的,因此,它使用get方法訪問列表中的任意一個元素時(random access),它的速度要比LinkedList快。LinkedList中的get方法是按照順序從列表的一端開始檢查,直到另外一端。對LinkedList而言,訪問列表中的某個指定元素沒有更快的方法了。

二.空間複雜度
在LinkedList中有一個私有的內部類,定義如下:

  private static class Entry {   
          Object element;   
          Entry next;   
          Entry previous;   
  }   

每個Entry物件reference列表中的一個元素,同時還有在LinkedList中它的上一個元素和下一個元素。一個有1000個元素的LinkedList物件將有1000個連結在一起的Entry物件,每個物件都對應於列表中的一個元素。這樣的話,在一個LinkedList結構中將有一個很大的空間開銷,因為它要儲存這1000個Entity物件的相關資訊。
ArrayList使用一個內建的陣列來儲存元素,這個陣列的起始容量是10.當陣列需要增長時,新的容量按如下公式獲得:新容量=(舊容量*3)/2+1,也就是說每一次容量大概會增長50%。這就意味著,如果你有一個包含大量元素的ArrayList物件,那麼最終將有很大的空間會被浪費掉,這個浪費是由ArrayList的工作方式本身造成的。如果沒有足夠的空間來存放新的元素,陣列將不得不被重新進行分配以便能夠增加新的元素。對陣列進行重新分配,將會導致效能急劇下降。如果我們知道一個ArrayList將會有多少個元素,我們可以通過構造方法來指定容量。我們還可以通過trimToSize方法在ArrayList分配完畢之後去掉浪費掉的空間。

三.總結
ArrayList和LinkedList在效能上各有優缺點,都有各自所適用的地方,總的說來可以描述如下:
1.對ArrayList和LinkedList而言,在列表末尾增加一個元素所花的開銷都是固定的。對ArrayList而言,主要是在內部陣列中增加一項,指向所新增的元素,偶爾可能會導致對陣列重新進行分配;而對LinkedList而言,這個開銷是統一的,分配一個內部Entry物件。

2.在ArrayList的中間插入或刪除一個元素意味著這個列表中剩餘的元素都會被移動;而在LinkedList的中間插入或刪除一個元素的開銷是固定的。

3.LinkedList不支援高效的隨機元素訪問。

4.ArrayList的空間浪費主要體現在在list列表的結尾預留一定的容量空間,而LinkedList的空間花費則體現在它的每一個元素都需要消耗相當的空間

可以這樣說:當操作是在一列資料的後面新增資料而不是在前面或中間,並且需要隨機地訪問其中的元素時,使用ArrayList會提供比較好的效能;當你的操作是在一列資料的前面或中間新增或刪除資料,並且按照順序訪問其中的元素時,就應該使用LinkedList了。

文章內容來自網上資源,只為記錄相關知識,如有侵權,請聯絡作者。

相關文章