ArrayList原始碼閱讀

2021-09-25 18:22:27 字數 4156 閱讀 7943

arraylist原始碼閱讀

// 序列化id

private static final long serialversionuid = 8683452581122892189l;

// 預設初始化容量

private static final int default_capacity = 10;

// 空陣列

private static final object empty_elementdata = {};

// 空陣列

private static final object defaultcapacity_empty_elementdata = {};

//儲存arraylist元素的陣列緩衝區。arraylist的容量是該陣列緩衝區的長度

transient object elementdata; // non-private to simplify nested class access

// 當前arraylist集合的大小,也就是elementdata陣列中資料元素的個數

private int size;

/*** 形式一:攜帶乙個int型別的引數,指定arraylist的初始容量

* * initialcapacity為我們所指定的陣列列表初始容量,

* 方法中對引數:initialcapacity的值進行了一系列判斷,

* 當引數:initialcapacity的初始容量小於0時無意義,直接丟擲非法引數異常。

* 當引數:initialcapacity大於0時,會直接建立乙個object型別的陣列,陣列的初始大小就是initialcapacity的值。

* 當initialcapacity等於0時,會直接將elementdata指向empty_elementdata空陣列。

* */

public arraylist(int initialcapacity) else if (initialcapacity == 0) else

} /**

* 形式二:無參構造方法

* 在構造方法中直接將 elementdata 指向 defaultcapacity_empty_elementdata空陣列,

* 該arraylist的size為初始值0。

*/public arraylist()

/*** 形式三:攜帶乙個collection型別的引數

* **中首先將集合引數通過toarray方法轉換成陣列,並賦值給elementdata,

* 然後對arraylist中的size進行賦值並判斷size是否等於0.

* 當大小為0時,直接將elementdata指向empty_elementdata空陣列。

* 當size不為0時執行copyof方法。

*/public arraylist(collection<? extends e> c) else

}

add()方法

/*** 方式一:直接新增資料元素到arraylist的尾部

* 方法中首先呼叫到ensurecapacityinternal方法,將size+1作為引數傳入。

* size用來表示當前陣列列表的大小,也就是elementdata中陣列中元素的個數,

* 大小size+1就是確保資料元素新增成功的最小容量.

*/public boolean add(e e)

/*** calculatecapacity方法中首先將elementdata 和defaultcapacity_empty_elementdata進行對比,

* 如果elementdata == defaultcapacity_empty_elementdata,則執行 if 語句體的操作,

* 否則直接呼叫ensureexplicitcapacity方法,將最小容量mincapacity作為引數傳入。

* 當我們通過arraylist的無參構造方法建立arraylist物件時,

* 在構造方法中會直接將elementdata指向defaultcapacity_empty_elementdata。

* 當我們通過arraylist的無參構造方法建立arraylist物件後,再呼叫add方法的時候會執行if語句體操作,

* 將mincapacity 重新賦值為default_capacity和mincapacity中的最大值。

*/private void ensurecapacityinternal(int mincapacity)

private static int calculatecapacity(object elementdata, int mincapacity)

return mincapacity;

}/**

* 方法中首先將變數modcount自增1,

* modcount是用來標記當前arraylist集合操作變化的次數,在fail-fast機制中會有用到這個變數.

* 接著判斷mincapacity - elementdata.length 是否大於0,

* 當mincapacity - elementdata.length大於0的時候說明當前elementdata陣列大小不夠使用,

* 需要擴容,grow方法就是具體的擴容操作

*/private void ensureexplicitcapacity(int mincapacity)

private void grow(int mincapacity)

remove()函式

/** 方式一:根據角標進行remove操作

*/public e remove(int index)

/** 方式二:根據資料元素進行remove操作

* 方法中首先對當前remove的資料元素進行null判斷。

* 無論當前remove的資料元素是否為null,都需要乙個for迴圈進行遍歷操作,

* 注意if條件塊的**在資料元素為null和不為null兩種情況下是不同的。

* 如果elementdata陣列中某一角標處的元素等於當前remove的資料元素,

* 會呼叫fastremove方法進行具體remove操作,最後return true表示remove操作成功。

* 否則return false表示remove操作失敗。

*/public boolean remove(object o)

} else

}return false;

}private void fastremove(int index)

set()函式

/*** set方法需要接受兩個引數,第乙個引數index為下角標,第二個引數element為資料元素,

* 表示將下角標index處的資料元素賦值為element。在方法中,首先對index下角標進行越界判斷,

* 然後獲取到角標index處的原資料元素oldvalue,

* 接著將角標index處的資料元素賦值為element,最後將原有資料元素oldvalue return掉。

*/public e set(int index, e element)

get()函式

public e get(int index)

clear()函式

public void clear()

contains()函式

/** indexof方法是將乙個資料元素傳入,返回該資料元素對應的下角標,

* 如果資料元素在當前arraylist中不存在,則返回-1。

* 也就是說當資料元素在當前arraylist中存在時,indexof(o) >= 0成立,結果為true,

* 否則為false。

*/public boolean contains(object o)

/*** indexof方法中對資料元素進行了null判斷,兩種情況下都進行了遍歷操作,

* 兩種情況下的if條件語句不同。

* 當滿足條件時,直接將對應的下角標return掉,否則return -1,

* 表示當前arraylist中不存在該元素

*/public int indexof(object o) else

return -1;

}

《JDK原始碼閱讀三》 ArrayList類

1.預設初始容量是10 當新增第乙個元素時,如果 this.elementdata defaultcapacity empty elementdata 那麼預設初始大小設定為10 2.擴容大小為 1.5倍 關鍵 int newcapacity oldcapacity oldcapacity 1 在a...

《原始碼閱讀》原始碼閱讀技巧,原始碼閱讀工具

檢視某個類的完整繼承關係 選中類的名稱,然後按f4 quick type hierarchy quick type hierarchy可以顯示出類的繼承結構,包括它的父類和子類 supertype hierarchy supertype hierarchy可以顯示出類的繼承和實現結構,包括它的父類和...

JDK1 8原始碼閱讀(五) ArrayList

顧名思義,arraylist的結構實際就是乙個陣列。所以它的特性很明顯,插入乙個元素的時候,是耗時是乙個常量時間o 1 在插入n個元素的時候,需要的時間就是o n arraylist類圖設計 初始化預設容量 private static final int default capacity 10 空...