JDK1 8 ArrayList 擴容詳解

2021-08-21 14:48:38 字數 2252 閱讀 9275

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