arraylist這個資料結構比較簡單,總體來說,arraylist 底層結構是陣列,他的很多方法都是從陣列上面演變而來的,下面分析下arraylist的擴容機制,
每次在add()乙個元素時,arraylist都需要對這個list的容量進行乙個判斷。如果容量夠,直接新增,否則需要進行擴容。在1.8 arraylist這個類中,擴容呼叫的是grow()方法,通過grow()方法中呼叫的arrays.copyof()方法進行對原陣列的複製,在通過呼叫system.arraycopy()方法進行複製,達到擴容的目的
幾個重要的初始化值
儲存陣列元素的緩衝區
// non-private to simplify nested class access
transient object elementdata;
預設空陣列元素
private static final object defaultcapacity_empty_elementdata = {};
預設初始化容量
private static final int default_capacity = 10;
陣列的大小
private int size;
記錄被修改的次數
protected transient int modcount = 0;
陣列的最大值
private static final int max_array_size = integer.max_value - 8
幾個重要的方法
乙個空的構造方法
預設陣列的長度為10
public arraylist()
新增元素的方法,
public boolean add(e e)
確認內部容量
private void ensurecapacityinternal(int mincapacity)
計算容量
private static int calculatecapacity (object elementdata, int mincapacity)
return mincapacity;
}
確認擴充套件容量
private void ensureexplicitcapacity(int mincapacity)
擴充套件方法
private void grow(int mincapacity)
陣列工具類中的複製方法
public static t copyof (t original, int newlength)
具體的複製方法
public static t copyof(u original, int newlength,
class<? extends t> newtype) {
@suppresswarnings("unchecked")
獲得者陣列物件
t copy = ((object)newtype == (object)object.class)
? (t) new object[newlength]
: (t) array.newinstance(newtype.getcomponenttype(), newlength);
呼叫系統的方法增加陣列容量
system.arraycopy(original, 0, copy, 0,math.min(original.length, newlength));
return copy;
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...
JDK1 8 ArrayList擴容機制原始碼分析
屬性 預設長度 private static final int default capacity 10 空陣列 有參構造器 private static final object empty elementdata 空陣列 無參構造器 private static final object def...