ArrayList原始碼解析和設計思路

2021-10-05 03:28:25 字數 2626 閱讀 7386

/**

當第乙個元素新增的時候,陣列會擴容到預設容量default_capacity(10)

三種初始化方式:無參初始化、指定大小初始化、指定初始資料初始化

private

static

final object[

] defaultcapacity_empty_elementdata =

;public

arraylist()

public

arraylist

(int initialcapacity)

else

if(initialcapacity ==0)

else

}

public

arraylist

(collection<

?extends

e> c)

else

}

新增就是往陣列裡新增元素,主要是分兩步:

public

boolean

add(e e)

private

void

ensurecapacityinternal

(int mincapacity)

private

static

intcalculatecapacity

(object[

] elementdata,

int mincapacity)

return mincapacity;

}

private

void

ensureexplicitcapacity

(int mincapacity)

private

void

grow

(int mincapacity)

注意:

底層通過 system.arraycopy 方法進行拷貝,這個是個native方法

/**

* @param src 被拷貝的陣列

* @param srcpos 從陣列那裡開始

* @param dest 目標陣列

* @param destpos 從目標陣列那個索引位置開始拷貝

* @param length 拷貝的長度

* 此方法是沒有返回值的,通過 dest 的引用進行傳值

*/public

static

native

void

arraycopy

(object src,

int srcpos,

object dest,

int destpos,

int length)

;

新增的時候是沒有對 null 進行校驗的,所以刪除的時候也是允許刪除 null 值的;

public

boolean

remove

(object o)

}else

}return

false

;}

private

void

fastremove

(int index)

int cursor;

// 下乙個元素的位置

int lastret =-1

;// index of last element returned; -1 if no such

int expectedmodcount = modcount;

//期望的版本號

public

boolean

hasnext()

public e next()

public

void

remove()

catch

(indexoutofbound***ception ex)

}

新增和刪除時間複雜度都為o(1)

size、isempty、get、set、add 等方法時間複雜度都是 o (1);

推薦用collections#synchronizedlist來保證執行緒安全

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,另外乙個空參。我們呼叫空參...