ArrayList關鍵方法原始碼分析

2021-10-17 09:00:57 字數 2998 閱讀 8865

概述

arraylist是乙個動態陣列,陣列大小可變,它實現了list介面,並且實現了list中所有對元素操作的方法。arraylist刪除元素時間複雜度為o(n),其他方法如isemptygetsize

時間複雜度都為o(1)。arraylist底層實現是陣列,每乙個arraylist例項都有乙個capacity屬性,這個屬性表示arraylist中儲存元素的數量。在新增大量元素前,arraylist會進行擴容操作,這樣避免了大量的重新分配記憶體的操作。當新增乙個元素後,arraylist的容量會自動增大,由於擴容操作非常耗時,所以初始化arraylist時最好把容量設定大一些。

成員變數

/**

* 預設的初始化容量是10

*/private

static

final

int default_capacity =10;

/** * 陣列長度為0的空陣列

*/private

static

final object[

] empty_elementdata =

;/* 用於預設大小空例項的共享空陣列例項。

* 我們將defaultcapacity_empty_elementdata和empty_elementdata區別開來

* 以便在新增第乙個元素時知道要膨脹多少。

*/private

static

final object[

] defaultcapacity_empty_elementdata =

;/**

* 底層是乙個object陣列

*/transient object[

] elementdata;

/** * arraylist的大小

*/private

int size;

構造方法
/**

* 指定容量的構造方法

*/public

arraylist

(int initialcapacity)

else

if(initialcapacity ==0)

else

}/**

* 不指定陣列容量則使用預設容量為10的空陣列

*/public

arraylist()

add方法以及擴容流程
/**

* 在陣列最後新增新的元素

* 新增元素前確保內部容量夠用,否則進行擴容操作

*/public

boolean

add(e e)

// 確定擴容的最小容量

public

void

ensurecapacity

(int mincapacity)

}// 計算 elementdata陣列的容量

private

static

intcalculatecapacity

(object[

] elementdata,

int mincapacity)

return mincapacity;

}// 確定陣列內部容量

private

void

ensurecapacityinternal

(int mincapacity)

// 如果 mincapacity大於陣列長度則進行擴容

private

void

ensureexplicitcapacity

(int mincapacity)

/** * 可分配的陣列最大長度

* */

private

static

final

int max_array_size = integer.max_value -8;

/** * 擴容操作,新的陣列容量newcapacity增加為原來的1.5倍,若newcapacity小於mincapacity,則選擇

* mincapacity作為擴容值

*/private

void

grow

(int mincapacity)

/**

* 大陣列擴容

remove方法

public e remove

(int index)

remove方法中使用了system.arraycopy將後面的陣列元素進行拷貝。system.arraycopy(elementdata, index+1, elementdata, index,nummoved)第乙個引數表示源陣列,第二個引數srcpos代表要複製的起始位置,第三個引數表示目的陣列,第四個引數destpos代表目的陣列放置的起始位置,最後乙個引數代表需要複製的長度

public

static

void

arraycopy

(object src,

int srcpos,

object dest,

int destpos,

int length)

ArrayList的remove 方法原始碼解讀

remove index public boolean remove object obj else return false arraylist的remove object obj 方法判斷是否為同乙個物件的時候用的是equals方法,如果我們要移除list中的自定義類的時候需要重寫equals方...

mybatis getMapper()方法原始碼解析

public class type,sqlsession sqlsession trycatch exception e override public object invoke object proxy,method method,object args throws throwable els...

JDK1 8 ArrayList擴容機制原始碼分析

屬性 預設長度 private static final int default capacity 10 空陣列 有參構造器 private static final object empty elementdata 空陣列 無參構造器 private static final object def...