ArrayList部分原始碼

2021-10-05 15:23:22 字數 3609 閱讀 8451

//預設初始容量

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 如果擴容...