屬性:
// 預設長度
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;
可以從原始碼看到,empty_elementdata用在有參構造器當初始容量為0時共享賦值用,defaultcapacity_empty_elementdata 用在無參構造器賦值用// 空參構造器
public
arraylist()
// 有參構造器
public
arraylist
(int initialcapacity)
else
if(initialcapacity ==0)
else
}
兩者都是用來減少空陣列的建立,所有空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...