ArrayList原始碼總結

2021-07-31 07:22:16 字數 2223 閱讀 6881

1.1無引數建構函式

public arraylist() 

private static final object empty_elementdata = {};

public boolean add(e e) 

private void ensurecapacityinternal(int mincapacity)

ensureexplicitcapacity(mincapacity);

}private void ensureexplicitcapacity(int mincapacity)

private void grow(int mincapacity)

public static t copyof(t original, int newlength)

總結:1.7以前的版本預設初始化為10的容量,但在1.7版本是需要擴容的,也是擴容容量為10,但是有乙個陣列copy的過程

1.2傳入容量的建構函式

public arraylist(int initialcapacity)
總結:和以前版本一樣,傳入初始化容量大小

1.3傳入集合的建構函式

public arraylist(collection<? extends e> c)
總結:c.toarray()是方法中重新建立乙個陣列返回

2.擴容

private void grow(int mincapacity)
private static int hugecapacity(int mincapacity)
private static final int max_array_size = integer.max_value - 8;

注:2.1容量夠就不需要擴容,直接放入陣列

2.2容量不夠就需要擴容原始容量1.5倍+1

2.3假如容量還不夠,傳入值就是擴容的值

2.4假如擴容的值 比 max_array_size 大,擴容值就是integer.max_value 否則max_array_size;

2.5最大擴容值 就是 integer.max_value

3.1 arrays.copyof()和system.arraycopy()

public static t copyof(t original, int newlength) 

public static t copyof(u original, int newlength, class<? extends t> newtype)

arrays.copyof()方法,它有很多個過載的方法,但實現思路都是一樣的

該方法實際上是在其內部又建立了乙個長度為newlength的陣列,呼叫system.arraycopy()

方法是native方法,將原來陣列中的元素複製到了新的陣列中

屬於淺複製

public t toarray(t a) 

public object toarray()

注:大致相同,底層都是使用copy到乙個新的陣列,唯一不同的就是返回的型別

toarray(t a) 返回的可以整體向下轉型,toarray()不可以。

5.clone

public object clone()  catch (clonenotsupportedexception e) 

}

注:使用copyof copy資料,所以淺複製

5、arraylist基於陣列實現,可以通過下標索引直接查詢到指定位置的元素,因此查詢效率高,但每次插入或刪除元素,就要大量地移動元素,插入刪除元素的效率低。

6、在查詢給定元素索引值等的方法中,原始碼都將該元素的值分為null和不為null兩種情況處理,arraylist中允許元素為null。

7.add(索引,值) 和 addall(索引,值)

流程:首先判斷是否需要擴容,需要的話就copy乙個新的陣列,然後判斷是直接放在陣列的為後面新增,還是在中間新增,所以中間新增的話涉及到陣列的移動。新增在陣列的尾端不涉及到陣列的移動

8.remove 

流程:假如刪除的資料的索引實在尾部,不涉及到資料的移動,只需要刪除資料,假如是在中間就需要涉及到資料的移動

ArrayList原始碼分析

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

ArrayList原始碼剖析

建構函式 有3個建構函式 1 在jdk原始碼中arraylist無參的建構函式,預設初始化大小是10 2 帶有指定大小引數的建構函式 3 帶有集合引數的建構函式 一 確定arrarlist的容量 1 若arraylist的容量不足以容納當前的全部元素,設定新的容量 原始容量 3 2 1。2 如果擴容...

ArrayList原始碼理解

與linkedlist原始碼理解放在一起查閱,效果更好 對隊成員變數的分析,可以知道arraylist的資料結構 對add 方法的分析,可以得知arraylist新增資料的效率不高 對get 方法的分析,可以看出arraylist查詢的效率非常高 對remove 方法的分析,可以了解到arrayli...