首先來看arraylist的構造方法有哪些
一、arraylist的構造方法
無參構造
傳入指定引數
這個暫時不用管
在arraylist中有乙個elementdate的陣列,arraylist底層就是用object陣列來實現的
這裡還定義了乙個空陣列,在arraylist使用無參構造方法時使用
回到問題,如果arraylist在初始化時,沒有傳遞引數,如:
arraylist list=new arraylist();//這裡先不使用泛型
這時,會呼叫arraylist的無參構造方法,也就是
這時把乙個定義的object的空陣列的引用賦值給了當前物件的elementdata陣列,即在arraylist在呼叫無參構造時,arraylist是乙個空陣列,並沒有指定預設容量。
二、在第一次新增元素時,會指定arraylist的陣列容量
首先我們檢視arraylist,add()方法的原始碼
這個有兩個add()方法,第乙個是add方法傳遞乙個引數,可以直接放入元素。第二個add方法傳遞乙個陣列下標和要存放的元素。這裡我們以第乙個add方法討論。
在存放第乙個元素時,呼叫add方法,在add方法裡第一行,這個方法表示進行陣列是否需要擴容的判斷,這裡的size也是arraylist裡定義的乙個變數,表示陣列裡的元素有多少個。也就是說我們在之前使用無參構造時,arraylist是乙個空陣列,即size==0,在執行第一行方法時傳遞的是size+1,即傳遞引數為1,我們進入到這個ensurecapacitiinternal方法裡。
這裡首先看這個方法,傳遞了elementdata陣列,和我們之前傳進來的引數1
再往下看這個calculatecapacity方法
這裡就是第一次給arraylist陣列設定初始容量的關鍵地方,在if語句就判斷了,這個陣列是不是為乙個空陣列。我們之前在呼叫無參構造時就把elmentdata設定為空陣列。所以他會執行if語句裡的語句,返回了乙個math.max(default_capacity,mincapacity),也就是返回他們兩個之間的最大值,而default_capacity,在arraylist原始碼裡設定為10。
所以在和mincapacity為1的引數進行比較時,會返回10。所以我們回來到這裡來看看。
然後傳遞引數10進入這個ensureexplicitcapacity方法中,我們進到這個方法的原始碼來看看。
這裡我們直接看if語句,我們把剛剛傳進來的引數10,減去這個陣列的長度,即10-0,條件成立,進入到if語句中,然後執行這個grow方法,並且把10傳遞進去。再進入到grow方法裡。
這個grow方法其實就是擴容陣列容量的,首先,下面這兩行**
對原來的陣列容量進行1.5擴容,即newcapacity就是擴容後的長度。
因為我們前面初始化的陣列是沒有長度的,所以這裡擴容後還是0。
接下來這個if語句,用來和我們之前的傳入的引數(也就是之前傳遞進來的引數10)進行比較,最後把10賦值給了newcapacity。
第二個if語句是判斷陣列容量有沒有達到最大值,
這裡原始碼裡給出了最大值大小arraylist private static final int max_array_size = integer.max_value - 8 = 2147483639
所以直接跳過這部分。最後,返回了容量為10新的的陣列。
到這裡,arraylist的初始容量已經才變為10。
總結:
在new arraylist()時括號裡沒有指定引數的話,則arraylist這時的陣列容量為0,只有在第一次新增元素時,才會把陣列容量設為10。
以上是我對arraylist初始化時,陣列容量大小問題的理解,如果有錯誤的地方,希望大神們能夠指正!
類初始化時機
虛擬機器規範中並沒有強制約束何時進行載入,但是規範嚴格規定了有且只有下列五種情況必須對類進行初始化 載入 驗證 準備都會隨之發生 以上 5 種場景中的行為稱為對乙個類進行主動引用。除此之外,所有引用類的方式都不會觸發初始化,稱為被動引用。被動引用的常見例子包括 system.out.println ...
類的初始化時機
什麼情況下需要開始類載入過程的第乙個階段 載入 虛擬機器規範中並沒強行約束,這點可以交給虛擬機器的的具體實現自由把握,但是對於初始化階段虛擬機器規範是嚴格規定了如下幾種情況,如果類未初始化會對類進行初始化。建立類的例項 訪問類的靜態變數 除常量 被final修辭的靜態變數 原因 常量一種特殊的變數,...
資源的初始化時機
zend framework 中的資源是什麼時候初始化的呢?還是直接上 來看比較有說服力 protected function bootstrap resource null foreach this getpluginresourcenames as resource elseif is stri...