ArrayList原始碼學習

2021-09-19 05:12:05 字數 3566 閱讀 2363

對於arraylist我們都很熟悉,使用起來非常的方便,使用的較多的方法有add(),remove(),indexof()等,對於這種優秀的集合框架,研究其原始碼能讓我們對其掌握更加深刻,能更合理的應用在業務場景中,同時我們自己在寫程式時也能夠參考其設計思想,提供我們的編碼水平。

一.arraylist簡介

1.arraylist底層是陣列佇列,相當於是動態陣列,即它是基於陣列實現的乙個list類。

2.該類封裝了乙個object陣列,capacity屬性代表此陣列的長度,通過ensurecapacity方法可以一次性增加capacity,能減少增加重分配的次數來提高效能。

3.類的繼承結構和層次關係,如下圖:

如圖繼承了abstraclist抽象類,實現了list介面。list中定義上層介面,abstraclist對一些通用方法進行了實現,arraylist對自己特有的方法再進行實現。

實現了randomaccess介面,randomaccess介面是乙個標誌介面,表明實現這個介面的list集合是支援快速隨機訪問的。

實現了cloneable介面,即覆蓋了clone()函式,能被轉殖。

實現了serializable介面,表明其能被序列化,能通過序列化去傳輸。

另arralist是非執行緒安全的,想保證執行緒安全可以使用vector或copyonwritearraylist。

二.原始碼解析

1.屬性和構造方法:

/**

* 版本號

*/private static final long serialversionuid = 8683452581122892189l;

/*** 預設初始容量大小

*/private static final int default_capacity = 10;

/*** 空陣列(用於空例項)。

*/private static final object empty_elementdata = {};

//用於預設大小空例項的共享空陣列例項。

//我們把它從empty_elementdata陣列中區分出來,以知道在新增第乙個元素時容量需要增加多少。

private static final object defaultcapacity_empty_elementdata = {};

/*** 儲存arraylist資料的陣列

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

/*** arraylist 所包含的元素個數

*/private int size;

/*** 帶初始容量引數的建構函式。(使用者自己指定容量)

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

}/**

*預設建構函式,defaultcapacity_empty_elementdata 為0.初始化為10,也就是說初始其實是空數

*組 當新增第乙個元素的時候陣列容量才變成10

*/public arraylist()

/*** 構造乙個包含指定集合的元素的列表,按照它們由集合的迭代器返回的順序。

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

}

2.核心方法

2.1 add()方法

boolean add(e e)方法原始碼分析

//在list末尾新增指定元素

public boolean add(e e)

//確定容量是否充足的方法

private void ensurecapacityinternal(int mincapacity)

//確認陣列容量,接著往下分析

ensureexplicitcapacity(mincapacity);

}private void ensureexplicitcapacity(int mincapacity)

private void grow(int mincapacity)

void add(int index, e element)原始碼分析
//在特定位置插入元素

public void add(int index, e element)

/*** a version of rangecheck used by add and addall.

*/private void rangecheckforadd(int index)

2.2 remove()方法

remove(int index)方法
//刪除指定位置上的元素

public e remove(int index)

remove(object o)方法
//通過傳入的元素來刪除list中的此元素,原理就是遍歷陣列,查詢到此元素後將其索引傳給fastremove

//方法,其內部實現與remove(int index)基本一致

public boolean remove(object o)

} else

}return false;

}

removeall(collection> c)方法
//批量刪除

public boolean removeall(collection> c)

//這個方法,用於兩處地方,如果complement為false,則用於removeall,如果為true,則給

retainall()用,retainall()是用來檢測兩個集合是否有交集的。

private boolean batchremove(collection> c, boolean complement) finally

if (w != size)

}return modified;

}

2.3 set()方法

public e set(int index, e element)
2.4 indexof()方法

public int indexof(object o)  else 

//如果元素不存在則返回-1

return -1;

}

2.4 get()方法

public e get(int index)

ArrayList原始碼學習

arraylist 乙個由陣列實現的集合物件,預設容量為10。特點 1 隨機查詢快 因為陣列是連續的記憶體空間可以使用索引直接定位陣列內的元素 2 隨機插入慢 因為會移動陣列 方法 add public boolean add e e grow 擴容時先判斷當前陣列size的2倍是否滿足所需最小si...

ArrayList原始碼學習

randomaccess 隨機快速訪問介面 cloneable是標記型的介面,它們內部都沒有方法和屬性,實現 cloneable來表示該物件能被轉殖,能使用object.clone 方法。如果沒有實現 cloneable的類物件呼叫clone 就會丟擲clonenotsupportedexcepti...

原始碼學習 ArrayList的擴容原始碼分析

原始碼如下 下面是arraylist的擴容機制 arraylist的擴容機制提高了效能,如果每次只擴充乙個,那麼頻繁的插入會導致頻繁的拷貝,降低效能,而arraylist的擴容機制避免了這種情況。如有必要,增加此arraylist例項的容量,以確保它至少能容納元素的數量 param mincapac...