ArrayList vs. LinkedList vs. Vector

1. List概覽

List,就像它的名字暗示的同樣,是一組排列有序的元素。當咱們討論List的時候,很容易將它和Set做比較。Set是一組惟一的並且排列無序的元素。html

下圖是集合類的層次結構圖。你能夠整體上知道咱們今天討論的主題。java

2. ArrayList vs. LinkedList vs. Vector

從上圖可知,它們都實現了List接口。它們的用法差很少,主要的區別在於它們對於不一樣操做的操做速度不一樣。程序員

ArrayList是能夠改變大小的數組。當有元素添加到ArrayList中去時,它的大小動態的增長。元素能夠直接經過get()和set() 方法進行訪問,由於ArrayList其實是數組。LinkedList是個雙向鏈表。它的add()和remove()方法比ArrayList快, 可是get()和set()方法卻比ArrayList慢。Vector和ArrayList相似,可是Vector是同步的。若是在線程安全的環境下, 使用ArrayList是更好的選擇。添加元素的時候,當超過初始容量的時候,Vector和ArrayList須要更多的空間:Vector須要將數組 的大小增長一倍,而ArrayList須要增長50%。數組

LinkedList還實現了Queue接口,這樣就比ArrayList和Vector多出了一些方法如offer(), peek(), poll()等。安全

注意:ArrayList的初始容量(initial capacity)很小。咱們應該設置一個比較大的初始容量,這樣能夠避免從新改變大小。性能

3. ArrayList的例子

1
2
3
4
5
6
7
8
9
10
11
12
13
ArrayList al =     new     ArrayList();
al.add(     3     );
al.add(     2     );     
al.add(     1     );
al.add(     4     );
al.add(     5     );
al.add(     6     );
al.add(     6     );
 
Iterator iter1 = al.iterator();
while     (iter1.hasNext()){
         System.out.println(iter1.next());
}

4. LinkedList的例子

1
2
3
4
5
6
7
8
9
10
11
12
13
LinkedList ll =     new     LinkedList();
ll.add(     3     );
ll.add(     2     );     
ll.add(     1     );
ll.add(     4     );
ll.add(     5     );
ll.add(     6     );
ll.add(     6     );
 
Iterator iter2 = ll.iterator();
while     (iter2.hasNext()){
         System.out.println(iter2.next());
}

由上可見,它們的用法相同,主要的區別在於它們內部的實現,以及操做的複雜度的不一樣。測試

5. Vector

Vector幾乎和ArrayList相等,主要的區別在於Vector是同步的。正由於此,Vector比ArrayList的開銷更大。一般大部分程序員都使用ArrayList,他們能夠本身寫代碼進行同步。spa

6. ArrayList vs. LinkedList的性能比較

時間複雜度以下:線程

* 表中的add()指的是add(E e)(便是在列表末尾添加元素),remove()方法指的是remove(int index)。code

ArrayList對於任意索引的插入/刪除操做的時間複雜度是O(n),而在列表的尾部的操做時間爲O(1)。

LinkedList對於任意索引的插入/刪除操做的時間複雜度是O(n),而在列表的頭部或尾部的操做時間爲O(1)。

(譯者注:這裏原文解釋的不是太清楚。對於任意索引的插入/刪除操做

Arrays:

  • 找到插入/刪除位置的時間複雜度是O(1)

  • 進行插入/刪除操做的時間複雜度是O(n)

Linked Lists:

  • 找到插入/刪除位置的時間複雜度是O(n)

  • 進行插入/刪除操做的時間複雜度是O(1)

我使用下面的代碼測試它們的性能:

package javaBasic;

import java.util.ArrayList;
import java.util.LinkedList;

public class ArrayListVSLinkedList {
    public static void main(String[] args) {
        ArrayList<Integer> arrayList = new ArrayList<Integer>();
        LinkedList<Integer> linkedList = new LinkedList<Integer>();

        // ArrayList add
        long 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 add
        startTime = 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 get
        startTime = 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 get
        startTime = 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 remove
        startTime = 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 remove
        startTime = 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:  135335877
LinkedList add: 52054821
ArrayList get:  539366
LinkedList get: 209043151
ArrayList remove:  608561973
LinkedList remove: 212236791

它們的性能的差異很顯著。LinkedList對於add()和remove()相對於ArrayList要快,可是get()要慢些。按照複雜度 以及測試結果來看,咱們很容易知道何時該使用ArrayList,何時該使用LinkedList。簡而言之,下面的狀況該使用 LinkedList:

  • 若是沒有大量的隨機訪問

  • 若是有不少add/remove的操做

相關文章
相關標籤/搜索