標籤:
翻譯自:ArrayList vs. LinkedList vs. Vector
1.列表概覽
就像它的名字一樣,List是一個元素的有序序列。當我們討論列表時把它與Set(兩兩不等且無序的元素集合)進行比較是一個好主意。下面是容器的類層次圖。從這個層次圖中可以瞭解Java容器的一般概念。
2.ArrayList vs. LinkedList vs. Vector
從可知,它們都實現了List介面,而且用法很相似。它們主要的不同在於它們的實現導致的對不同的操作有不同的效能。
ArrayList被實現為一個大小可變的數組。當有更多的元素添加到ArrayList時,它的大小會動態增加。因為ArrayList本質上是一個數組,所以可以通過get()和set()方法直接存取它的元素。
LinkedList被實現為一個雙向鏈表,在增加和刪除元素的時候比ArrayList的效能要好,而對於get()和set()方法效能就不及ArrayList了。
Vector與ArrayList相似,但它是線程同步的。
當程式是安全執行緒的時候,ArrayList是一個更好的選擇。當添加更多的元素時,ArrayList和Vector會請求更多的空間,Vector每次會申請兩倍於當前大小的空間,而ArrayList每次只會增加當前大小50%的空間。LinkedList還實現了Queue介面,使得它比ArrayList和Vector有更多的方法,比如offer()、peek()、poll()等。
注意:ArrayList的初始容量非常小,所以以較大的初始容量構造ArrayList是一個很好的習慣,這樣可以避免重新分配空間的花費。
3.ArrayList樣本
ArrayList<Integer> al = new ArrayList<Integer>();al.add(3);al.add(2); al.add(1);al.add(4);al.add(5);al.add(6);al.add(6);Iterator<Integer> iter1 = al.iterator();while(iter1.hasNext()){ System.out.println(iter1.next());}
4.LinkedList樣本
LinkedList<Integer> ll = new LinkedList<Integer>();ll.add(3);ll.add(2); ll.add(1);ll.add(4);ll.add(5);ll.add(6);ll.add(6);Iterator<Integer> iter2 = ll.iterator();while(iter2.hasNext()){ System.out.println(iter2.next());}
就像上面樣本中展示的一樣,它們的用法很相似。真正的不同在於背後的實現和他們操作的複雜度。
5.Vector
Vector和ArrayList幾乎完全一樣,不同點是Vector是線程同步的。正因為這樣,Vector比ArrayList有一個額外的開銷。通常情況下,大多數Java程式員都會使用ArrayList,因為他們可以靠自己明確的實現同步。
6.ArrayList和LinkedList的效能比較
時間複雜度比較如下:
*表中add()指add(E e),remove()指remove(int index)
*ArrayList在任意位置增加/刪除操作的時間複雜度為O(n),但在列表尾的時間複雜度為O(1)。
*LinkedList在任意位置增加/刪除操作的時間複雜度為O(n),但在列表頭/尾的時間複雜度為O(1)。
可以用下面的代碼測試它們的效能:
ArrayList<Integer> arrayList = new ArrayList<Integer>();LinkedList<Integer> linkedList = new LinkedList<Integer>();// ArrayList addlong startTime = System.nanoTime();for (int i = 0; i < 100000; i++) { arrayList.add(i);}long endTime = System.nanoTime();long duration = endTime - startTime;System.out.println("ArrayList add: " + duration);// LinkedList addstartTime = System.nanoTime();for (int i = 0; i < 100000; i++) { linkedList.add(i);}endTime = System.nanoTime();duration = endTime - startTime;System.out.println("LinkedList add: " + duration);// ArrayList getstartTime = System.nanoTime();for (int i = 0; i < 10000; i++) { arrayList.get(i);}endTime = System.nanoTime();duration = endTime - startTime;System.out.println("ArrayList get: " + duration);// LinkedList getstartTime = System.nanoTime();for (int i = 0; i < 10000; i++) { linkedList.get(i);}endTime = System.nanoTime();duration = endTime - startTime;System.out.println("LinkedList get: " + duration);// ArrayList removestartTime = System.nanoTime();for (int i = 9999; i >=0; i--) { arrayList.remove(i);}endTime = System.nanoTime();duration = endTime - startTime;System.out.println("ArrayList remove: " + duration);// LinkedList removestartTime = System.nanoTime();for (int i = 9999; i >=0; i--) { linkedList.remove(i);}endTime = System.nanoTime();duration = endTime - startTime;System.out.println("LinkedList remove: " + duration);
輸出如下:
ArrayList add: 13265642LinkedList add: 9550057ArrayList get: 1543352LinkedList get: 85085551ArrayList remove: 199961301LinkedList remove: 85768810
效能差別很明顯,LinkedList在增加/刪除元素方面更快,在訪問元素時更慢。根據時間複雜度表和測試結果,我們可以知道什麼時候用ArrayList或LinkedList。簡單地說,在下面的情況時應該用LinkedList:
沒有大量的隨機訪問元素的操作;
有大量增加/刪除元素的操作。
翻譯自:ArrayList vs. LinkedList vs. Vector
ArrayList vs. LinkedList vs. Vector