//預設初始容量
private
static
final
int default_capacity =10;
//空陣列,有參建構函式,引數為0時,將elementdata陣列賦值為empty_elementdata
private
static
final object[
] empty_elementdata =
;//空陣列,無參建構函式時,將elementdata陣列賦值為該空陣列
private
static
final object[
] defaultcapacity_empty_elementdata =
;transient object[
] elementdata;
初始化通過建構函式進行初始化
1.無參建構函式
//無參建構函式
public
arraylist()
將elementdata賦值為defaultcapacity_empty_elementdata(預設空陣列),雖然arraylist()的預設初始容量為10,但這裡陣列為空,此時呼叫size(),結果為0。
常出問題的點:
list
> list =
newarraylist
<
>()
;list.
get(1)
.add(0
);//錯!因為此時為空陣列,就越界了(可能沒有人像我這麼蠢吧……)
2.有參建構函式
//有參建構函式
public
arraylist
(int initialcapacity)
else
if(initialcapacity ==0)
else
}
判斷引數大小,對elementdata陣列進行初始化。
這裡!雖然對陣列大小進行了初始化,但是list沒有,此時size()還是為0!
看,依然越界!
3.有參建構函式,引數為collection介面
先將傳入引數toarray(),如果得到的陣列長度不為0,那麼判斷陣列型別是否是object型別,因為arraylist的底層是object陣列,如果不是,則使用arrays.copyof(…)的方法進行拷貝,內部會建立乙個object型別的陣列,長度為size,進行拷貝,使得得到的elementdata是object陣列。
//listpath = new arraylist<>();
//list> list = new arraylist<>(path);
public
arraylist
(collection<
?extends
e> c)
else
}
這裡toarray()呼叫的時collection介面的toarray()方法,具體呼叫哪個類的toarray()方法應該是看c的實現類。
arraylist裡的toarray()方法:
將elementdata陣列中的元素拷貝到長度為size的object陣列中,並返回該陣列。
public object[
]toarray()
接收t型別的陣列,返回乙個t型別的陣列
主要對比a.length和list中的元素個數size()
如果a.length= size,直接呼叫system.arraycopy方法,將elementdata中的元素拷貝到a中。
public
ttoarray
(t a)
新增add(e e)
public
boolean
add(e e)
private
void
ensurecapacityinternal
(int mincapacity)
這裡!如果是第一次add陣列,那麼elementdata就為預設空陣列,此時返回預設容量和最小容量的最大值(其實應該就是返回的預設容量吧?畢竟size==0,size+1 == 1 < 10? 但我感覺我理解的有錯)
private
static
intcalculatecapacity
(object[
] elementdata,
int mincapacity)
return mincapacity;
}
private
void
ensureexplicitcapacity
(int mincapacity)
add(int index,e element)
public
void
add(
int index, e element)
擴容新容量 = 原容量+原容量/2;
如果新容量《需要容量,那麼新容量=需要容量
如果新容量》陣列最大大小,那麼新容量=hugecapacity(minvalue)
然後將原陣列元素複製到新陣列。
(下次一定用個好看的工具畫圖)
刪除public e remove(int index)其實add(int index, e element)的原理是一樣的,就是陣列複製。
public e remove
(int index)
參考資料1.原始碼
2.3.
ArrayList部分原始碼學習筆記
一 線性表分為順序表和煉表兩大類 二 順序表 1 特點 1 元素所佔的儲存空間是連續的 2 元素在儲存空間按邏輯順序存放。3 查詢快,增刪慢 2 例如 arraylist 基於陣列實現,類似於乙個動態陣列,容量可自增的,所以可通過角標獲取指定位置的元素 增加元素 是建立大容量陣列,複製原陣列,再進行...
ArrayList原始碼分析
arraylist是平時使用很多的乙個類,趁有時間,我也閱讀以下原始碼,以幫助自己加深理解。類的層次結構這裡就不列出了,主要分析一下原始碼部分,屬性部分 protected transient int modcount 0 這個屬性是從abstractlist繼承過來的,每次arraylist進行結...
ArrayList原始碼剖析
建構函式 有3個建構函式 1 在jdk原始碼中arraylist無參的建構函式,預設初始化大小是10 2 帶有指定大小引數的建構函式 3 帶有集合引數的建構函式 一 確定arrarlist的容量 1 若arraylist的容量不足以容納當前的全部元素,設定新的容量 原始容量 3 2 1。2 如果擴容...