ArrayList原始碼解析

2022-07-25 15:42:40 字數 3248 閱讀 5507

1、屬性

//

預設初始容量為10

private

static

final

int default_capacity = 10;

//空物件陣列,當使用者指定的陣列長度為0時,返回該陣列

private

static

final object empty_elementdata ={};

//空物件陣列,使用預設的構造方法是,返回該陣列

private

static

final object defaultcapacity_empty_elementdata ={};

//物件陣列

transient

object elementdata;

//物件陣列當前的容量

private

intsize;

//分配給物件陣列的最大容量

private

static

final

int max_array_size = integer.max_value - 8;

2、構造方法

//無參

構造方法

public

arraylist()

public arraylist(int

initialcapacity)

else

if (initialcapacity == 0)

else

}

//

不常用public arraylist(collection<? extends e>c)

else

}

3、新增

//

在陣列尾部新增元素

public

boolean

add(e e)

//

檢查陣列是否需要擴容,其中引數mincapacity表示當前陣列需要儲存元素的個數

private

void ensurecapacityinternal(int

mincapacity)

//

計算陣列的最小容量

private

static

int calculatecapacity(object elementdata, int

mincapacity)

return

mincapacity;

}

//

判斷陣列是否需要擴容

private

void ensureexplicitcapacity(int

mincapacity)

//

陣列擴容的方法

private

void grow(int

mincapacity)

//

陣列長度越界判斷

private

static

int hugecapacity(int

mincapacity)

//

在指定位置新增元素

public

void add(int

index, e element)

//

檢查是否越界

private

void rangecheckforadd(int

index)

注意:一開始陣列是乙個空陣列,只有在第一次新增元素的時候,容量才會擴充為10。如果不夠的話,就擴容1.5倍。

疑問:為什麼要初始化為空陣列呢?

因為開發中,很多時候建立了arraylist的物件,但是沒有裝元素,這個時候的話,如果初始化為10的陣列,就浪費空間了。

4、查詢

//

獲取下標為index的元素

public e get(int

index)

//

檢查下標是否越界

private

void rangecheck(int

index)

//

返回index下標的元素

e elementdata(int

index)

5、修改

//

將index下標的元素修改成element,並返回之前未修改時的元素

public e set(int

index, e element)

6、刪除

//

指定位置刪除,並返回刪除的元素

public e remove(int

index)

//

指定元素刪除,如果有,返回true,否則返回false

public

boolean

remove(object o)

} else

}return

false

; }

//

刪除下標為index的元素

private

void fastremove(int

index)

7、其他方法

//

返回陣列的大小

public

intsize()

//

判斷陣列是否為空

public

boolean

isempty()

//

判斷陣列是否存在元素o

public

boolean

contains(object o)

//

檢查陣列是否存在元素o,如果存在,返回其第一次出現下標,否則返回-1

public

intindexof(object o)

else

return -1;

}

//

將陣列後面多餘的空間刪掉,長度為儲存元素的個數

public

void

trimtosize()

}

ArrayList原始碼解析

new arraylist public arraylist public arraylist int initialcapacity else if initialcapacity 0 else private static final object defaultcapacity empty e...

ArrayList原始碼解析

arraylist內部的結構採用的是陣列。transient object elementdata non private to simplify nested class access當我們使用預設建構函式的時候,如下 private static final object defaultcapa...

ArrayList 原始碼解析

從日常 看arraylist的執行流程 第一步 我們初始化乙個 arraylist 然後新增乙個元素,如下 public class arraylisttest arraylist的建構函式和方法有三個,乙個是帶有初始大小的arraylist,乙個傳入collection,另外乙個空參。我們呼叫空參...