ArrayList原始碼分析

2021-08-16 21:20:06 字數 2974 閱讀 8958

有參建構函式傳入乙個int

public arraylist(int capacity) 

//如果為0則返回空陣列,否則new 乙個capacity的陣列

array = (capacity == 0 ? emptyarray.object : new object[capacity]);

}

無參建構函式

public arraylist()
有參建構函式傳入乙個集合

public arraylist(collection<? extends e> collection) 

//將集合轉換為陣列

object a = collection.toarray();

if (a.getclass() != object.class)

//再將array的陣列賦值為a

array = a;

//獲得新陣列的大小

size = a.length;

}

指定索引的位置新增物件

@override public void add(int index, e object) 

//當前的大小小於陣列的大小,說明可以直接插入

if (s < a.length) else

//然後在將物件插入進去

a[index] = object;

//陣列的大小+1

size = s + 1;

//modcount代表修改的次數

modcount++;

}

newcapacity(s)原始碼分析

private static int newcapacity(int currentcapacity)
新增到最後乙個位置

@override public boolean add(e object) 

//預設新增到最後乙個位置

a[s] = object;

//陣列的大小加1

size = s + 1;

modcount++;

return true;

}

新增乙個集合:預設新增到尾部

@override public boolean addall(collection<? extends e> collection) 

//舊陣列的大小和陣列

object a = array;

int s = size;

int newsize = s + newpartsize; //如果新增溢位,arraycopy將失敗。

if (newsize > a.length)

//從a的陣列的s開始 新增

system.arraycopy(newpart, 0, a, s, newpartsize);

size = newsize;

modcount++;

return true;

}

contains包含原始碼分析

@override public boolean contains(object object) 

}} else }}

return false;

}

indexof下標獲得原始碼分析

@override public int indexof(object object) 

}} else }}

return -1;//沒有返回-1

}

查詢字元或者子串是後一次出現的地方lastindexof原始碼分析,這裡不貼原始碼了,實際就是for迴圈從陣列的大小開始遞減

移除原始碼分析

@override public e remove(int index) 

@suppresswarnings("unchecked") e result = (e) a[index];

//將要移除的陣列後面的資料全部往前移一位

system.arraycopy(a, index + 1, a, index, --s - index);

//之後末尾的位置賦值為空

a[s] = null;//防止記憶體洩漏

//大小等於s

size = s;

modcount++;//修改的次數+1

return result;

}

toarray原始碼分析

@override public object toarray()
arraylistiterator迭代器原始碼分析

private class arraylistiterator implements iterator

@suppresswarnings("unchecked") public e next()

if (rem == 0)

remaining = rem - 1;//剩餘的數量-1

//removalindex = ourlist.size - rem 預設等於0,rem會不斷的減去1

return (e) ourlist.array[removalindex = ourlist.size - rem];

}public void remove()

if (removalidx < 0)

system.arraycopy(a, removalidx + 1, a, removalidx, remaining);

a[--size] = null; // prevent memory leak

removalindex = -1;

expectedmodcount = ++modcount;

}}

ArrayList原始碼分析

arraylist是平時使用很多的乙個類,趁有時間,我也閱讀以下原始碼,以幫助自己加深理解。類的層次結構這裡就不列出了,主要分析一下原始碼部分,屬性部分 protected transient int modcount 0 這個屬性是從abstractlist繼承過來的,每次arraylist進行結...

ArrayList原始碼分析

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

ArrayList原始碼分析

預設容量大小 private static final int default capacity 10 例項化arraylist時是乙個空object陣列 private static final object empty elementdata 預設容量空元素陣列,當第一次新增元素時會和此陣列判斷...