所有的分析基於jdk15arraylist的資料結構是陣列。基於陣列的實現。是執行緒不安全的資料結構。實現了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的空列表。1 boolean add(e e) 新增元素arraylist(int initialcapacity) 構造乙個具有指定初始容量的空列表。
arraylist(collection extends e> c) 構造乙個列表,該列表包含指定集合的元素,其順序由集合的迭代器返回。
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 clonepublic 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...