Arraylist原始碼分析擴容

2021-09-25 04:30:34 字數 1794 閱讀 8551

成員變數:

// 序列化id

private static final long serialversionuid = 8683452581122892189l;

// 預設初始化容量

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;

// 操作計數

protected transient int modcount = 0;

初始化:

/**

*帶int形參的建構函式arraylist(int initialcapacity),函式首先判斷initialcapacity

*是否為0,如果是0,則將empty_elementdata賦值給elementdata,如果大於0,就將*elementdata初始化為乙個容量為initialcapacity的物件陣列

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

}

如下**:指定預設容量大小為0,則將empty_elementdata賦值給elementdata

arraylistarraylist=new arraylist<>(0);

arraylist.add("222");

arraylist.add("444");給集合新增元素把乙個元素新增到elementdata中,要做這個之前,要擴容

public boolean add(e e)
如果empty_elementdata是由defaultcapacity_empty_elementdata賦值而成,那麼就將擴容的數量mincapacitydefault_capacity進行比較,然後取其中的最大值,最大值再傳參給ensureexplicitcapacity函式,ensureexplicitcapacity(mincapacity)方法,在這個方法中先將運算元記錄值modcount自增,然後根據mincapacityelementdata.length的大小來決定是否需要增加容量 

private void ensurecapacityinternal(int mincapacity) 

ensureexplicitcapacity(mincapacity);

}private void ensureexplicitcapacity(int mincapacity)

private void grow(int mincapacity) 

private static int hugecapacity(int mincapacity)

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