ArrayList原始碼分析

2021-08-19 13:21:39 字數 2211 閱讀 2408

最近因為擁抱變換,所以開始無奈的面試之路。因為在集合的原始碼分析上,出了些問題,所以這段時間,好好重新理一理常用的集合原始碼。(版本基於jdk1.7)

毫無疑問,提到常用集合。arraylist勢必是第乙個被搬出來的,因此我們就先拿它開刀了。

arraylist的初始化,只有在第一次add的時候進行new資料,陣列預設容量是10。

private static final int default_capacity = 10;

每次add,第一步先初始化,初始化過後,開始判斷是否需要擴容。

擴容的判斷,需要借助內部的乙個size變數,這個變數用於統計當前陣列的真實容量。也就是說我們的每一次add,size都會++。因此在我們進行擴容判斷的時候,就是通過這個size和陣列的當前最大容量進行比較。

如果if (mincapacity - elementdata.length > 0)其中mincapacity==size+1。滿足這個條件說明需要擴容。

擴容的過程比較直接,直接上**:

private

void

grow(int mincapacity)

賦值的過程,就沒什麼好說的了:

elementdata[size++] = e;
ok,add方法的過程就先看到此。非常簡單的過程。1、第一次add,初始化乙個容量10的陣列。2、每次add()需要判斷是否需要擴容。3、擴容過程完畢,把資料查到陣列中。

接下來,讓我們看乙個往明確的下標中add的方法。

剛開始的過程沒什麼好說的,就是比add(e e)的過程,多一步先判斷index是否越界;然後依舊是初始化,和擴容的過程。

//判斷是否越界

rangecheckforadd(index);

//初始化以及擴容

ensurecapacityinternal(size + 1);

既然我們是往某個下標下插值,那麼插入之前,我們就要給要插入的index空出位置來,也就是陣列整體移動位置。也就是下邊這行**。

system.arraycopy(elementdata, index, elementdata, index + 1,

size - index);

通過這個操作我們能看到乙個問題,那就是如果我們連續進行相同的add(int index,e e)操作,那麼很明顯不會出現覆蓋。所以,如果我們想要有覆蓋的操作,需要呼叫set系列方法(後續會對此進行分析)。

這裡必須得提一點,這裡的操作因為需要移動陣列,因此對於arraylist來說,這是乙個效率比較低的操作。

也印證了我們老生常談的話題:陣列適合隨機讀取;鍊錶適合增加與刪除。

沒啥好說的,同上:

elementdata[size++] = e;
關於get操作,其實沒啥好特別留意的,很普通的操作。因為直接返回對應陣列的index下標即可吶。

public e get(int index)
其實覆蓋操作,也沒什麼難,就是單純把index那個資料覆蓋了,僅此而已。

public e set(int index, e element)
remove的操作也沒有特別需要注意的地方。基本上貼上**,就能很清楚的明白:

public e remove(int index)
基本上到這一步關於arraylist的正常使用的分析就告一段落。當然,我們提到arraylist,難免會扯到vector身上。雖然它的身份略顯尷尬,充其量就是乙個跑龍套的角色。

而且它內部的保證執行緒安全的操作,僅僅是使用了synchronized關鍵字而已。因為就不增加篇幅去梳理它了。

結束arraylist的分析,我們可以發現,arraylist的實現,相對比較的簡單。需要留意的點比較的少,大概就剩下了如果此次add,超出了現有陣列容量,進行1.5倍擴容。

本菜開源的乙個自己寫的demo,這個專案拆解並組合了很多業務。目的在於遇到類似業務,可以快速的ctrl+c/v。希望能給androider們有所幫助,水平有限,見諒見諒…

ArrayList原始碼分析

arraylist是平時使用很多的乙個類,趁有時間,我也閱讀以下原始碼,以幫助自己加深理解。類的層次結構這裡就不列出了,主要分析一下原始碼部分,屬性部分 protected transient int modcount 0 這個屬性是從abstractlist繼承過來的,每次arraylist進行結...

ArrayList原始碼分析

有參建構函式傳入乙個int public arraylist int capacity 如果為0則返回空陣列,否則new 乙個capacity的陣列 array capacity 0 emptyarray.object new object capacity 無參建構函式 public arrayl...

ArrayList原始碼分析

預設容量大小 private static final int default capacity 10 例項化arraylist時是乙個空object陣列 private static final object empty elementdata 預設容量空元素陣列,當第一次新增元素時會和此陣列判斷...