首先無論是ArrayList還是LinkedList這兩個集合類,都是用於存儲一系列的對象引用的。
1、ArrayList是實現了基於動態數組的數據結構,LinkedList基於鏈表的數據結構;
2、對於隨機訪問get和set,ArrayList要優於LinkedList,因為ArrayList可以隨機定位,而LinkedList要移動指針一步一步的移動到節點處;
3、對於新增和刪除操作aLinedList比較占優勢,只需要對指針進行修改即可,而ArrayList要移動數據來填補被刪除的對象的空間;
ArrayList和LinkedList在性能差異
時間層面
首先一點關鍵的是,ArrayList的內部實現是基於基礎的對象數組的,因此,它使用get方法訪問列表中的任意一個元素時,它的速度要比LinkedList快。LinkedList中的get方法是按照順序從列表的一端開始檢查,直到另外一端。對LinkedList而言,訪問列表中的某個指定元素沒有更快的方法了,但是這都僅限於集合的遍歷。
如果我們需要大量插入或刪除數據則LinkedList是更好的選擇,比如將一個元素分別添加到兩個集合的首位,此時ArrayList需要將所有已經存在的元素都會后移,這就意味着數據移動和復制上的開銷。相反的,將一個元素加到LinkedList的最開端只是簡單的為這個元素分配一個記錄,然后調整兩個連接。在LinkedList的開端增加一個元素的開銷是固定的,而在ArrayList的開端增加一個元素的開銷是與ArrayList的大小成比例的。
空間層面
在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不支持高效的隨機元素訪問,所以LinkedList做隨機訪問所消耗的時間與這個list的大小是成比例的。而相應的,在ArrayList中進行隨機訪問所消耗的時間是固定的;
4、ArrayList的空間浪費主要體現在在list列表的結尾預留一定的容量空間,而LinkedList的空間花費則體現在它的每一個元素都需要消耗相當的空間。