標籤:java 基礎 arraylist linkedlist
首先亮一下他們兩個基本區別,面試的時候可以用來和面試官嘮嗑啊
1、ArrayList實現了基本動態數組結構,Linked基於鏈表的結構。鏈表?什麼是鏈表?答:“鏈表是一種實體儲存體單元上非連續、非順序的儲存結構,資料元素的邏輯順序是通過鏈表中指標串連次序實現的”註:此句話通過了科普中國百科科學詞條編寫與應用工作項目的審核。
2、對於get和set,ArrayList的效能優於LinkedList,因為Linked要移動指標,麻煩的很
3、對於add和remove,LinkedList要優於ArrayList,因為鏈表就擅長這個,ArrayList還要移動資料
LinkedList和ArrayList是兩個集合類,用於儲存一系列的對象引用(references)。例如我們用ArrayList來儲存一系列String或者Integer。那麼ArrayList和LinkedList在效能上有什麼差別?
假如我們有一個很大的列表,裡面的元素已經排好序,我們對這個列進行二分尋找(binary search),比較兩種List的速度,源碼如下:
public class TestList { public static final int N = 50000; public static List<Integer> values; static{ Integer vals[] = new Integer[N]; Random random = new Random(); for(int i=0,currval=0;i<N;i++){ vals[i] = new Integer(currval); currval += random.nextInt(100)+1; } values = Arrays.asList(vals); } static long timeList(List<Integer> 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("error occoured "); } } return System.currentTimeMillis() - start; } public static void main(String[] args){ System.out.println("ArrayList的耗時:"+timeList(new ArrayList<Integer>(values))); System.out.println("LinkedList的耗時:"+timeList(new LinkedList<Integer>(values))); }}
ArrayList的耗時:12
LinkedList的耗時:5346
很明顯,ArrayList的時間明顯小於LinkedList。二分法尋找使用的是隨機存取原則,而LinkedList是不支援快速隨機訪問的。
下面再看一個對List進行大量增加和刪除的例子:
public class ListDemo { public static final int N = 50000; static long timeList(List<Object> list){ long start = System.currentTimeMillis(); Object o = new Object(); for(int i=0;i<N;i++){ list.add(o); } return System.currentTimeMillis() - start; } public static void main(String[] args) { System.out.println("ArrayList的耗時:"+timeList(new ArrayList<Object>())); System.out.println("LinkedList的耗時:"+timeList(new LinkedList<Object>())); }}
ArrayList的耗時:5
LinkedList的耗時:4
結果是出乎我的意料之外的,我把N分別設定為了5000、500000他們的耗時都非常接近,看來理論知識與現實情況還有有一定的差距。當我將N增到至500W的時候LinkedList的耗時竟然超過了ArrayList。希望看到我的文章的知道真相的大神們可以給我講解下,謝謝。
Java中LinkedList和ArrayList的區別