ArrayList的擴容機制,以及和LinkedList,Vestor的區別
阿新 • • 發佈:2018-12-06
首先我們先了解一下它們三者
ArrayList:的底層實現為陣列儲存在記憶體中,執行緒不同步。可通過陣列下標的形式進行查詢,所以在查詢方面的效率較為出色,常用在查詢較多的情景下。
LinkedList:的底層實現為連結串列形式,也為執行緒不同步。而連結串列的底層也決定了它在查詢方面不如陣列底層的ArrayList,而在指定位置插入等修改操作下,效能優於ArrayList
Vestor:也是和ArrayList、LinkedList一樣實現了java.util.List介面。最大的區別在於Vestor是執行緒同步的,所以在效率方面不如另外兩者,適用於多執行緒專案中
以上總結:ArrayList是Array(動態陣列)的資料結構 ,當進行get和set操作的時候速度要優於LinkedList因為LinkedList是線性的資料儲存方式,所以需要移動指標從前往後依次查詢。 LinkedList是Link(連結串列)的資料結構,當進行add和remove操作時 LinkedList比ArrayList的效率更高,因為ArrayList是陣列,所以在其中進行增刪操作時,會對操作點之後所有資料的下標索引造成影響,需要進行資料的移動。 而Vestor是它們三者中唯一一個執行緒安全的,所以效率不及兩者
擴容機制
在翻閱arraylist原始碼時
public void ensureCapacity(int minCapacity) { modCount++; int oldCapacity = elementData.length; if (minCapacity > oldCapacity) { Object oldData[] = elementData; int newCapacity = (oldCapacity * 3)/2 + 1; if (newCapacity < minCapacity) newCapacity = minCapacity; // minCapacity is usually close to size, so this is a win: elementData = Arrays.copyOf(elementData, newCapacity); } }
如果不指定大小初始大小為10 擴容後的大小= 原始大小+原始大小/2 + 1。在進行插入等操作的時候,如果判斷出大小不夠,會依據此方法進行擴容。(以上是JDK1.6版本的原始碼,在JDK1.7中擴容規則進行了修改,改為了擴容後的大小= 原始大小+原始大小/2)
由於linkedlist它的底層是用雙向連結串列實現的,沒有初始化大小,也沒有擴容的機制