ArrayList原始碼分析1

2021-10-19 14:20:07 字數 3990 閱讀 4437

所有的分析基於jdk15

arraylist的資料結構是陣列。基於陣列的實現。是執行緒不安全的資料結構。實現了list介面。

//預設arraylist的容量

private

static

final

int default_capacity =10;

/** 空陣列例項 */

private

static

final object[

] empty_elementdata =

;/** 共享的空陣列例項 */

private

static

final object[

] defaultcapacity_empty_elementdata =

;/** 陣列元素資料 */

transient object[

] elementdata;

/** 陣列元素個數 */

private

int size;

arraylist() 構造乙個初始容量為10的空列表。

arraylist​(int initialcapacity) 構造乙個具有指定初始容量的空列表。

arraylist​(collection extends e> c) 構造乙個列表,該列表包含指定集合的​​元素,其順序由集合的迭代器返回。

1 boolean add(e e) 新增元素
public

boolean

add(e e)

modcount是arraylist的父類abstractlist的屬性。主要目的是在迭代器iterator在迭代集合的時候不允許對集合結構做修改,如果做了修改,就會報併發修改異常。後續詳解。

add的新增在內部方法add(e, elementdata, size);中完成。

private

void

add(e e, object[

] elementdata,

int s)

如果元素個數和陣列長度相等,就擴容,否則就直接新增元素。陣列元素長度+1.來看下擴容的實現,呼叫grow()方法。

private object[

]grow()

也是私有的,內部呼叫grow(int mincapacity)實現。引數是當前容量+1。

private object[

]grow

(int mincapacity)

else

}

如果是空陣列,就返回最小容量和預設容量最大值的陣列。

elementdata =

newobject

[math.

max(default_capacity, mincapacity)

新的容量:

int newcapacity = arrayssupport.

newlength

(oldcapacity,

mincapacity - oldcapacity,

/* minimum growth */

oldcapacity >>

1

呼叫arrayssupport.newlength方法實現。

public

static

intnewlength

(int oldlength,

int mingrowth,

int prefgrowth)

return

hugelength

(oldlength, mingrowth)

;}

這裡的prefgrowth為首選增長率,mingrowth為最小增長率。

mingrowth=mincapacity - oldcapacity

prefgrowth=oldcapacity>>1=0.5oldcapacity.因此實際擴容後的長度為1.5倍的原陣列長度。最後進行了陣列複製。

elementdata = arrays.

copyof

(elementdata, newcapacity)

;

2 void add(int index, e element) 新增元素指定位置
public

void

add(

int index, e element)

首先檢查是否索引越界,然後判斷如果元素的數量和陣列長度相等,進入邏輯。擴容,然後複製舊的資料,然後賦值操作。

3 boolean addall​(collection extends e> c) 新增集合

public

boolean

addall

(collection<

?extends

e> c)

4 trimtosize() 將當前陣列容量設定為元素的長度
public

void

trimtosize()

}

5 ensurecapacity(int mincapacity) 確保容量

若arraylist的容量不足以容納當前的全部元素,設定 新的容量=newlength = math.max(最小容量-舊陣列容量, 舊陣列容量/2) + 舊陣列容量=1.5舊陣列容量

public

void

ensurecapacity

(int mincapacity)

}

6 size() 獲取陣列元素的個數
public

intsize()

7 isempty() 判斷是否為空
public

boolean

isempty()

8 indexofrange()查詢元素
int

indexofrange

(object o,

int start,

int end)}}

else}}

return-1

;}

9 contains 判斷是否包含元素
public

boolean

contains

(object o)

10 indexof()正向查詢
public

intindexof

(object o)

11 lastindexof()逆向查詢
public

intlastindexof

(object o)

12 clone
public object clone()

catch

(clonenotsupportedexception e)

}

13 object toarray() 轉化為陣列
public object[

]toarray()

14 get(int index) 獲取元素
public e get

(int index)

15 remove(int index) 刪除指定位置元素
public e remove

(int index)

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原始碼分析

最近因為擁抱變換,所以開始無奈的面試之路。因為在集合的原始碼分析上,出了些問題,所以這段時間,好好重新理一理常用的集合原始碼。版本基於jdk1.7 毫無疑問,提到常用集合。arraylist勢必是第乙個被搬出來的,因此我們就先拿它開刀了。arraylist的初始化,只有在第一次add的時候進行new...