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

2021-10-11 09:27:34 字數 2041 閱讀 7004

屬性:

// 預設長度

private

static

final

int default_capacity =

10;

// 空陣列(有參構造器)

private

static

final object[

] empty_elementdata =

;

// 空陣列(無參構造器)

private

static

final object[

]*defaultcapacity_empty_elementdata*

=;

這裡要說明一下:兩個空陣列的區別主要是用來起區分用,針對有參和無參的構造器在擴容時做區分走不通的擴容邏輯,優化效能。

// 底層陣列

transient object[

] elementdata;

// 有效元素個數

private

int size;

構造器:

// 空參構造器

public

arraylist()

// 有參構造器

public

arraylist

(int initialcapacity)

else

if(initialcapacity ==0)

else

}

可以從原始碼看到,empty_elementdata用在有參構造器當初始容量為0時共享賦值用,defaultcapacity_empty_elementdata 用在無參構造器賦值用

兩者都是用來減少空陣列的建立,所有空arraylist都共享空陣列。兩者的區別主要是用來起區分用,針對有參和無參的構造器在擴容時做區分走不通的擴容邏輯,優化效能。

// 新增乙個元素

public

boolean

add(e e)

// 新增乙個集合

public

boolean

addall

(collection<

?extends

e> c)

/**mincapacity:陣列所需容量

**/// 確保容量足夠。如果容量不夠,add方法就會下標越界。

private

void

ensurecapacityinternal

(int mincapacity)

/**elementdata:arraylist底層陣列

mincapacity:陣列所需容量

**/// 計算容量

private

static

intcalculatecapacity

(object[

] elementdata,

int mincapacity)

// 如果不是空參構造器建立的陣列,則直接返回size+1。

return mincapacity;

}/**

mincapacity:陣列所需容量

**/// 判斷陣列是否需要擴容。

private

void

ensureexplicitcapacity

(int mincapacity)

// grow方法,對陣列進行擴容。

private

void

grow

(int mincapacity)

總結

1、預設的擴容規則是 新陣列容量 = 陣列容量 + 陣列容量 / 2

2、如果使用無參建構函式,那麼第一次呼叫add()方法時,首次擴容後的陣列長度為10。

3、如果使用有慘建構函式,但是傳入的引數是0,會按照預設的擴容規則擴容。

4、如果陣列擴容後,陣列容量還無法滿足所需容量,則取所需容量作為新的容量。

JDK1 8 ArrayList 擴容詳解

arraylist這個資料結構比較簡單,總體來說,arraylist 底層結構是陣列,他的很多方法都是從陣列上面演變而來的,下面分析下arraylist的擴容機制,每次在add 乙個元素時,arraylist都需要對這個list的容量進行乙個判斷。如果容量夠,直接新增,否則需要進行擴容。在1.8 a...

JDK1 8 ArrayList原始碼分析

設定初始容量 private static final int default capacity 10 空例項陣列 private static final object empty elementdata 預設大小的空例項陣列,在第一次呼叫ensurecapacityinternal方法中的 ca...

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...