對於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...