ArrayList,LinkedList,Vector,Stack之間的區別

wangchun_166發表於2018-01-16

ArrayList,LinkedList,Vestor這三個類都實現了java.util.List介面,但它們有各自不同的特性,主要如下:

一,執行緒安全性

Vector、Stack:執行緒安全

ArrayList、LinkedList:非執行緒安全


二,實現方式

LinkedList:雙向連結串列

ArrayList,Vector,Stack:Object陣列


三,容量擴充套件方面

由於ArrayList和Vector(Stack繼承自Vector,只在Vector的基礎上新增了幾個Stack相關的方法,故之後不再對Stack做特別的說明)使用陣列實現,當陣列長度不夠時,其內部會建立一個更大的陣列,然後將原陣列中的資料拷貝至新陣列中;

陣列長度擴充套件策略:如需擴充套件,則每次至少擴充套件至(原長度*3)/2 + 1

如果在建立Vector時不指定capacityIncrement(自動擴充套件長度)的值,如需擴充套件,則每次至少擴充套件至原長度的2倍


四,效率方面

這裡僅僅比較ArrayList和LinkedList之間的效率差異

1,查詢

ArrayList直接通過下標進行定位

LinkedList則需要進行遍歷,平均遍歷次數應為n/4

對於指定位置查詢,由於可以通過下標直接進行定位,ArrayList的速度遠快於LinkedList

但是如果都為首尾位置的查詢,情況會大為不同,因為LinkedList也是可以直接定位到首尾位置的,此時ArrayList和LinkedList的效率相同


2,插入

對於ArrayList,指定位置插入有可能首先需要對陣列容量進行擴充套件,之後還有可能導致陣列中的資料需要順次移動(程式碼中通過陣列拷貝實現,避免了資料一個一個的移動),極端情況下插入一個資料將進行兩次陣列拷貝;

如果不指定插入位置,則插入至陣列末端,此時只需考慮可能的陣列容量擴充套件對效能帶來的影響

總體來說,LinkedList效率高於ArrayList,即使在末尾插入,ArrayList也需要考慮可能的容量擴充套件對效能帶來的影響

3,修改

和查詢屬於同一種情況

4,刪除

指定位置的刪除和插入屬於同一種情況

除了刪除指定位置資料,ArrayList和LinkedList都包含一個clear()方法用來清除所有資料



相關文章