1. 程式人生 > >ArrayList的擴容機制,以及和LinkedList,Vestor的區別

ArrayList的擴容機制,以及和LinkedList,Vestor的區別

首先我們先了解一下它們三者

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它的底層是用雙向連結串列實現的,沒有初始化大小,也沒有擴容的機制