ArrayList vs. LinkedList vs. Vector

來源:互聯網
上載者:User

標籤:

翻譯自: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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.