http://www.programcreek.com/2013/03/arraylist-vs-linkedlist-vs-vector/
1.List總覽
List,顧名思義,是一個有序序列。當我們討論List時,會和Set進行比較,Set是一堆無序且唯一的元素集合。下面是接口Collection的類的層級圖。你可以從中對於Java Collections有總體的瞭解。
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 性能
時間複雜度比較如下:
*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
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