ArrayList的動態擴容機制

2021-08-15 05:42:00 字數 1021 閱讀 6907

一般問的時候應該是用jdk1.6回答;jdk1.7之後也要知道;

初始化:

有三種方式

預設的構造器,將會以預設的大小來初始化內部的陣列:public arraylist();

用乙個icollection物件來構造,並將該集合的元素新增到arraylist:public arraylist(collection<? extends e> c)

用指定的大小來初始化內部的陣列:public arraylist(int initialcapacity) 

這裡我們來重點關注一下無引數構造器的實現過程:

通過**可是它的初始容量為0。而在之前jdk1,6中,初始容量為10。 

根據傳入的最小需要容量mincapacity來和陣列的容量長度對比,若mincapactity大於或等於陣列容量,則需要進行擴容。(如果實際儲存陣列是空陣列,則最小需要容量就是預設容量)
實現擴容:

jdk7中採用>>位運算,右移動一位。 容量相當於擴大了1.5倍;

舉例說明:新增20個元素到arraylist中 

當第一次插入元素時才分配10(預設)個物件空間。之後擴容會按照1.5倍增長。

也就是當新增第11個資料的時候,arraylist繼續擴容變為10*1.5=15;

當新增第16個資料時,繼續擴容變為15 * 1.5 =22個;

總結:在jdk1.7中,如果通過無參構造的話,初始陣列容量為0,當真正對陣列進行新增時,才真正分配容量。

每次按照1.5倍(位運算)的比率通過copeof的方式擴容。

在jkd1.6中,如果通過無參構造的話,初始陣列容量為10.每次通過copeof的方式擴容後容量為原來的1.5倍加1.以上就是動態擴容的原理。

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介面,支援快速隨機訪問,實際上就是通過下標序號進行快速訪問 實現了...