初始化:預設的構造器,將會以預設的大小來初始化內部的陣列:有三種方式
public arraylist();
用乙個icollection物件來構造,並將該集合的元素新增到arraylist:public arraylist(collection<? extends e> c)
用指定的大小來初始化內部的陣列:public arraylist(int initialcapacity)
這裡我們來重點關注一下無引數構造器的實現過程:
通過**可是它的初始容量為0。而在之前jdk1,6中,初始容量為10。
根據傳入的最小需要容量mincapacity來和陣列的容量長度對比,若mincapactity大於或等於陣列容量,則需要進行擴容。(
如果實際儲存陣列是空陣列,則最小需要容量就是預設容量)
舉例說明:新增20個元素到arraylist中實現擴容:
jdk7中採用
>>位運算,右移動一位。 容量相當於擴大了1.5倍;
當第一次插入元素時才分配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的動態擴容機制
一般問的時候應該是用jdk1.6回答 jdk1.7之後也要知道 初始化 有三種方式預設的構造器,將會以預設的大小來初始化內部的陣列 public arraylist 用乙個icollection物件來構造,並將該集合的元素新增到arraylist public arraylist collectio...
ArrayList的動態擴容機制
先來看一道筆試題 下面的arraylist會擴容幾次?arraylistarraylist new arraylist 20 我們先看一下原始碼的動態擴容機制是如何實現的。下面以jdk1.7為例 private void grow int mincapacity 通過下面這一行 int newcap...
ArrayList動態陣列 擴容機制
當建立乙個arraylist物件時可以不傳引數,arraylist會自己初始化乙個預設 size,private static final int default capacity 10 當呼叫該物件中add 時會先將判斷自己陣列大小 盡量自己估算乙個與自己專案儲存的資料大小相差不大的值,避免多次擴...