關於ArrayList初始化時,初始容量的問題

2021-10-09 09:17:04 字數 2595 閱讀 1084

首先來看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...