1、ArrayList
- 非線程安全
- 基於對象數組
- get(int index)不需要遍歷數組,速度快;
- iterator()方法中調用了get(int index),所以速度也快
- set(int index, E e)不需要遍歷數組,速度快
- add方法需要考慮擴容與數組復制問題,速度慢
- remove(Object o)需要遍歷數組,並復制數組元素,速度慢
- remove(int index)不需要遍歷數組,需要復制數組元素,但不常用
- contain(E)需要遍歷數組
2、LinkedList
- 非線程安全
- 基於環形雙向鏈表
- get(int index)需要遍歷鏈表,速度慢;
- iterator()方法中調用了get(int index),所以速度也慢
- set(int index, E e)方法中調用了get(int index),所以速度也慢
- add方法不需要考慮擴容與數組復制問題,只需創建新對象,再將新對象的前后節點的指針指向重新分配一下就好,速度快
- remove(Object o)需要遍歷鏈表,但不需要復制元素,只需將所要刪除的對象的前后節點的指針指向重新分配一下以及將所要刪除的對象的三個屬性置空即可,速度快
- remove(int index)需要遍歷鏈表,但不需要復制元素,只需將所要刪除的對象的前后節點的指針指向重新分配一下以及將所要刪除的對象的三個屬性置空即可,但不常用
- contain(E)需要遍歷鏈表
3、Vector(線程安全的ArrayList)
- 線程安全
- 擴容機制與ArrayList不同
4、Stack(繼承於Vector)
- 線程安全
- 效率低下,可采用雙端隊列Deque或LinkedList來實現,Deque用的較多
總結:
- 在查詢(get)、遍歷(iterator)、修改(set)使用的比較多的情況下,用ArrayList
- 在增加(add)、刪除(remove)使用比較多的情況下,用LinkedList
- 在需要線程安全而且對效率要求比較低的情況下,使用Vector,當然,實現ArrayList線程安全的方法也有很多,以后再說
- 在需要使用棧結構的情況下,使用Deque,Stack廢棄就行了