ArrayList原始碼剖析

2021-06-29 15:34:07 字數 2010 閱讀 6612

建構函式:有3個建構函式

1)在jdk原始碼中arraylist無參的建構函式,預設初始化大小是10;

2)帶有指定大小引數的建構函式

3)帶有集合引數的建構函式

一、確定arrarlist的容量

1、若arraylist的容量不足以容納當前的全部元素,設定新的容量 = (原始容量 * 3) / 2 + 1。

2、如果擴容後容量還是不夠,則直接將mincapacity設定為當前容量。

public

void

ensurecapacity(int mincapacity)

}

二、新增元素

public

boolean

add(e e)

將element新增到arraylist的指定位置
public

void add(int

index, e element)

三、獲取index位置的元素值

public e get(int

index)

四、設定index位置的值為element

public e set(int

index, e element)

五、刪除arraylist指定位置的元素

public e remove(int

index)

刪除元素
public

boolean remove(object o)

} else

}return

false;

}

private

void fastremove(int

index)

六、arraylist是否包含object(o)

public

boolean

contains(object o)

正向查詢,返回元素的索引值

public

intindexof(object o) else

return -1;

}}

七、返回arraylist的object陣列

public object toarray()
八、將集合c追加到arraylist中

public

boolean

addall(collection<? extends e> c)

分析arraylist原始碼比較重要的幾點總結:

1、arraylist是如何確定容量的—->呼叫ensurecapacity方法。

2、arraylist是基於陣列的,所以獲取元素和設定元素都是這樣的形式:elementdata[index],只需獲取到陣列索引就可以了。

3、在arraylist原始碼中,大量使用了system.arraycopy(object src, int srcpos, object dest, int destpos, int length)

src:源陣列; srcpos:源陣列要複製的起始位置; dest:目的陣列; destpos:目的陣列放置的起始位置; length:複製的長度。

比如arraylist的增加、刪除、將集合c追加到arraylist中這三種操作,都使用了這個方法。

4、arrays類的靜態方法:copyof(t original, int newlength)

original - 要複製的陣列 ; newlength - 要返回的副本的長度 ; newtype - 要返回的副本的型別

比如arraylist的toarray()方法就使用了arrays.copyof方法。

ArrayList集合原始碼剖析

public boolean add e e public e set int index,e element public void add int index,e element 結果為elementdata 執行elementdata index mazi 步驟為elementdata 1 m...

JDK1 8 ArrayList原始碼剖析(二)

jdk1.8中新增的特性 1.void foreach consumer super e action jdk8中新特性,對list中每個元素分別進行操作,如 arraylistal new arraylist al.add 0 al.add 1 al.add 2 al.add 3 al.forea...

原始碼剖析 Hashtable 原始碼剖析

hashtable同樣是基於雜湊表實現的,同樣每個元素都是key value對,其內部也是通過單鏈表解決衝突問題,容量不足 超過了閾值 時,同樣會自動增長。hashtable也是jdk1.0引入的類,是執行緒安全的,能用於多執行緒環境中。hashtable同樣實現了serializable介面,它支...