ArrayList vs. LinkedList vs. Vector

http://www.programcreek.com/2013/03/arraylist-vs-linkedlist-vs-vector/

1.List總覽

List,顧名思義,是一個有序序列。當我們討論List時,會和Set進行比較,Set是一堆無序且唯一的元素集合。下面是接口Collection的類的層級圖。你可以從中對於Java Collections有總體的瞭解。

java-collection-hierarchy.jpeg


2.ArrayList vs. LinkedList vs.Vector

從層級圖看出,他們都實現了List接口。他們使用方式相似。他們的主要區別在於實現方式,這會導致每個操作表現的性能不同。

ArrayList 被實現成爲一個可變長數組,它的尺寸隨着元素添加而動態增長。它的元素可被直接訪問,使用get和set方法。ArrayList 本質上就是一個數組。

LinkedList 被實現成爲一個雙鏈表。它在增刪操作的性能上優於ArrayList,但是在get和set方法劣於ArrayList。

Vector 與ArrayList相似,但它是同步的。

如果你的程序是線程安全的那麼ArrayList是更好的選擇。Vector和ArrayList 隨元素逐漸增加需要更多的空間。Vector 每次增長爲它的數組尺寸的兩倍,而ArrayList 每次只增長50%。LinkedList優於還實現了Queue接口,因此有更多的方法,如offer(),peek(),poll(),etc.

注意: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 是同步的。因此,比ArrayList開銷大,大部分程序員都使用ArrayList代替Vector,他們自己可以顯式地同步。

6.ArrayList vs. LinkedList 性能

時間複雜度比較如下:

arraylist-vs-linkedlist-complexity

*add()表示add(E e),remove()代表remove(int index)

用以下例碼測試他們的性能

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:  13265642
LinkedList add: 9550057
ArrayList get:  1543352
LinkedList get: 85085551
ArrayList remove:  199961301
LinkedList remove: 85768810

arraylist-vs-linkedlist

The difference of their performance is obvious. LinkedList is faster in add and remove, but slower in get. Based on the complexity table and testing results, we can figure out when to use ArrayList or LinkedList. In brief, LinkedList should be preferred if:

  • there are no large number of random access of element

  • there are a large number of add/remove operations


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章