前面兩篇文章對 ArrayList
、LinkedList
的原始碼進行了分析,這篇文章對 List
做個簡單的總結。
List 介面結構
List
以線性方式儲存元素,其中允許存放重複元素,元素有序。主要有以下幾個實現類:
ArrayList
:隨機訪問元素效率較高,但增刪元素較慢;LinkedList
:增刪元素效率較高,但隨機訪問效率較低;Vector
:與ArrayList
,但它是執行緒安全的,同步通過synchronized
實現,效率較低,一般不建議使用;Stack
:是一個先進先出的棧,繼承自Vector
;
它的主要結構如下:
陣列與 ArrayList 的區別
陣列與 ArrayList
之間的區別如下:
- 陣列可以儲存基本型別和物件;而
ArrayList
只能儲存物件,需要進行拆裝箱。所以如果特別關注效能,可以選用陣列。 - 陣列需要指定大小,且不能改變;而
ArrayList
可以指定或不指定初始化容量,且支援自動擴容。所以,如果資料大小已知,並且對資料的操作比較簡單,可以使用陣列。 ArrayList
最大的優勢就是封裝了很多運算元組的方法。如果操作比較複雜,可以選用ArrayList
。- 表示多維陣列時,用陣列更加直觀。例如
Object[][]
。
其實一般來說,在普通業務開發中,直接使用 ArrayList
就可以了,相比於損耗一點點效能,換來使用上的方便簡單,也是可以接受。
但如果做的是較底層的開發,如中介軟體,效能優化等,陣列一般會比較好。
ArrayList 與 LinkedList 的區別
ArrayList
優點:ArrayList
底層基於動態陣列實現,由於地址連續,按照下標直接計算操作地址,隨機訪問效率較高。
缺點:但同樣是因為地址連續,在插入和刪除資料時,陣列需要移動資料,所以插入和刪除操作的效率較低。
LinkedList
優點:LinkedList
底層基於雙向連結串列實現,由於地址是任意的,所以在建立節點時比較簡單,增加和刪除操作的效率比較高。另外,它也適用於佇列、棧形式的場景。
缺點:由於 LinkedList
訪問元素時需要一個一個地移動指標,所以隨機訪問的效率較低。
適用場景
可以按照如下要求進行選擇:
- 如果對資料隨機訪問的操作較多,則選用
ArrayList
。 - 如果對資料的增加或刪除操作較多,則選用
LinkedList
。
ArrayList 與 Vector 的區別
ArrayList
和 Vector
很相似,主要有以下三個區別:
Vector
是執行緒安全的,而ArrayList
不是。Vector
中的方法被synchronized
修飾,效率很低,一般不贊成使用。- 兩者都是基於動態陣列實現,但是擴容時,兩者的增加方式不同。
ArrayList
每次擴至1.5
倍,而Vector
擴至2
倍。 Vector
可以設定擴容時的自增容量capacityIncrement
,而ArrayList
不可以。ArrayList
支援Iterator
和ListIterator
迭代器;而Vector
除此之外,還支援Enumeration
。
它們的適用場景如下:
Vector
是執行緒安全的,而ArrayList
是非執行緒安全的。如果在非多執行緒的情境下,一般採用ArrayList
效率比較高。由於Vector
效率較低,如果在多執行緒環境下,一般使用CopyOnWriteArrayList
。