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 空...