Java集合(5)之 List 總結

TimberLiu發表於2019-02-22

前面兩篇文章對 ArrayListLinkedList 的原始碼進行了分析,這篇文章對 List 做個簡單的總結。

List 介面結構

List 以線性方式儲存元素,其中允許存放重複元素,元素有序。主要有以下幾個實現類:

  • ArrayList:隨機訪問元素效率較高,但增刪元素較慢;
  • LinkedList:增刪元素效率較高,但隨機訪問效率較低;
  • Vector:與 ArrayList,但它是執行緒安全的,同步通過 synchronized 實現,效率較低,一般不建議使用;
  • Stack:是一個先進先出的棧,繼承自 Vector

它的主要結構如下:

Java集合(5)之 List 總結

陣列與 ArrayList 的區別

陣列與 ArrayList 之間的區別如下:

  • 陣列可以儲存基本型別和物件;而 ArrayList 只能儲存物件,需要進行拆裝箱。所以如果特別關注效能,可以選用陣列。
  • 陣列需要指定大小,且不能改變;而 ArrayList 可以指定或不指定初始化容量,且支援自動擴容。所以,如果資料大小已知,並且對資料的操作比較簡單,可以使用陣列。
  • ArrayList 最大的優勢就是封裝了很多運算元組的方法。如果操作比較複雜,可以選用 ArrayList
  • 表示多維陣列時,用陣列更加直觀。例如 Object[][]

其實一般來說,在普通業務開發中,直接使用 ArrayList 就可以了,相比於損耗一點點效能,換來使用上的方便簡單,也是可以接受。

但如果做的是較底層的開發,如中介軟體,效能優化等,陣列一般會比較好。

ArrayList 與 LinkedList 的區別

ArrayList

優點:ArrayList 底層基於動態陣列實現,由於地址連續,按照下標直接計算操作地址,隨機訪問效率較高。

缺點:但同樣是因為地址連續,在插入和刪除資料時,陣列需要移動資料,所以插入和刪除操作的效率較低。

LinkedList

優點:LinkedList 底層基於雙向連結串列實現,由於地址是任意的,所以在建立節點時比較簡單,增加和刪除操作的效率比較高。另外,它也適用於佇列、棧形式的場景。

缺點:由於 LinkedList 訪問元素時需要一個一個地移動指標,所以隨機訪問的效率較低。

適用場景

可以按照如下要求進行選擇:

  • 如果對資料隨機訪問的操作較多,則選用 ArrayList
  • 如果對資料的增加或刪除操作較多,則選用 LinkedList

ArrayList 與 Vector 的區別

ArrayListVector 很相似,主要有以下三個區別:

  • Vector 是執行緒安全的,而 ArrayList 不是。Vector 中的方法被 synchronized 修飾,效率很低,一般不贊成使用。
  • 兩者都是基於動態陣列實現,但是擴容時,兩者的增加方式不同。ArrayList 每次擴至 1.5 倍,而 Vector 擴至 2 倍。
  • Vector 可以設定擴容時的自增容量 capacityIncrement,而 ArrayList 不可以。
  • ArrayList 支援 IteratorListIterator 迭代器;而 Vector 除此之外,還支援 Enumeration

它們的適用場景如下:

  • Vector 是執行緒安全的,而 ArrayList 是非執行緒安全的。如果在非多執行緒的情境下,一般採用 ArrayList 效率比較高。由於 Vector 效率較低,如果在多執行緒環境下,一般使用 CopyOnWriteArrayList

相關文章