ArrayList原始碼分析

2021-10-09 15:48:13 字數 1577 閱讀 1034

大家都知道arraylist的底層是陣列,那麼arraylist的原始碼是什麼樣的呢?

我大致翻了一下arraylist原始碼,不是很長,大概1500行左右,但是我們並不需要去一行一行的看,很容易雲裡霧裡而且沒有必要。

我們將從arraylist的初始化,增加和刪除方法以及arraylist的擴容來理解arraylist的核心原理。

//預設容量

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;

//初始化時指定了list大小就建立乙個同樣大小的陣列,如果list大小指定為0,元素陣列指定為空陣列

public arraylist(int initialcapacity) else if (initialcapacity == 0) else

}//初始化時不指定具體大小,預設為空陣列(我們一般這樣使用)

public arraylist()

下面我們來看看arraylist的add方法:

public boolean add(e e)
重點來看看ensurecapacityinternal(size + 1):

private void ensurecapacityinternal(int mincapacity) 

//需要擴容的數量

ensureexplicitcapacity(mincapacity);

}private void ensureexplicitcapacity(int mincapacity)

private static final int max_array_size = integer.max_value - 8;

private void grow(int mincapacity)

private static int hugecapacity(int mincapacity)

接下來看看remove方法:

public e remove(int index) 

// 通過 native 層去拷貝**

// src :原來的陣列

// srcpos:原來陣列的開始位置

// dest:新的陣列

// destpos:新陣列的開始位置

// length:拷貝多少個

public static native void arraycopy(object src, int srcpos,

object dest, int destpos,

int length);

ArrayList原始碼分析

arraylist是平時使用很多的乙個類,趁有時間,我也閱讀以下原始碼,以幫助自己加深理解。類的層次結構這裡就不列出了,主要分析一下原始碼部分,屬性部分 protected transient int modcount 0 這個屬性是從abstractlist繼承過來的,每次arraylist進行結...

ArrayList原始碼分析

有參建構函式傳入乙個int public arraylist int capacity 如果為0則返回空陣列,否則new 乙個capacity的陣列 array capacity 0 emptyarray.object new object capacity 無參建構函式 public arrayl...

ArrayList原始碼分析

最近因為擁抱變換,所以開始無奈的面試之路。因為在集合的原始碼分析上,出了些問題,所以這段時間,好好重新理一理常用的集合原始碼。版本基於jdk1.7 毫無疑問,提到常用集合。arraylist勢必是第乙個被搬出來的,因此我們就先拿它開刀了。arraylist的初始化,只有在第一次add的時候進行new...