ArrayList的動態擴容機制

2021-08-22 16:31:10 字數 732 閱讀 1631

先來看一道筆試題:

下面的arraylist會擴容幾次?

arraylistarraylist = new arraylist(20);
我們先看一下原始碼的動態擴容機制是如何實現的。下面以jdk1.7為例:

private void grow(int mincapacity)
通過下面這一行

int newcapacity = oldcapacity + (oldcapacity >> 1);

我們可以看到新的容量是舊容量的1.5倍。且通過位移操作實現,比直接算術運算效率更高。

我們回過頭來再看開頭的筆試題,arraylist的預設大小是10,

private static final int default_capacity = 10;
因此我們可以草率的下結論答案應該是2次。但是我們還要仔細看一下問題的根本:什麼情況下才會採用動態擴容機制?

通過檢視**可以發現只有在容量不夠的情況下才會採取動態擴容機制。而建立物件時指定容量為20,是不需要擴容的,

再來看一下構造方法的原始碼,

public arraylist(int initialcapacity)
我們可以看到直接將傳過來的初始容量傳遞給底層實現的陣列。並沒有什麼擴容機制。

最後,我們再來公布開頭問題的答案。經過分析,那就是擴容次數為0。

ArrayList的動態擴容

arraylist可以實現容量的自適應的增加,通過閱讀源 對這個機制進行一下簡單的分析。首先,arraylist有乙個初始的預設大小,為10.private static final int default capacity 10 從add方法為入口 public boolean add e e 可...

ArrayList動態擴容機制

初始化 有三種方式預設的構造器,將會以預設的大小來初始化內部的陣列 public arraylist 用乙個icollection物件來構造,並將該集合的元素新增到arraylist public arraylist collection c 用指定的大小來初始化內部的陣列 public array...

Arraylist動態擴容詳解

arraylist是基於陣列實現的,是乙個動態陣列,其容量能自動增長。arraylist不是執行緒安全的,只能用在單執行緒環境下。實現了serializable介面,因此它支援序列化,能夠通過序列化傳輸 實現了randomaccess介面,支援快速隨機訪問,實際上就是通過下標序號進行快速訪問 實現了...