1、ArrayList非線程安全基於對象數組get(int index)不需要遍曆數組,速度快;iterator()方法中調用了get(int index),所以速度也快set(int index, E e)不需要遍曆數組,速度快add方法需要考慮擴容與數組複製問題,速度慢remove(Object...
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廢棄就行了