Java ArrayList原始碼分析

2021-09-11 14:31:59 字數 1837 閱讀 7170

list家族中,arraylist可能是我們日常用得最多的了,熟悉其原始碼能讓我們對其更好的理解和使用。本文的原始碼基於jdk1.8.

首先看下面這張圖。其中虛線方框表示介面,實線方框表示類,實線實心箭頭表示繼承,而虛線空心箭頭表示實現某一介面。

看圖後可以對arraylist得出以下結論:

transient object elementdata; //用來存放元素的object陣列

private int size; //元素的大小

複製**

既然叫做arraylist,顧名思義,內部使用array來儲存資料。果然,我們發現,其內部定義了乙個object陣列,用來儲存資料,還有乙個int型的size屬性,用來表示元素的大小。

以上就是全部的構造方法。這裡有乙個疑問就是,這三個構造方法都有一種將乙個空陣列賦值給elementdata的情況,為什麼無參的賦值的是defaultcapacity_empty_elementdata,而其餘的賦值的是empty_elementdata呢?先保留這個疑問繼續往下看。

對比這兩種擴容方式,如果遇到資料量比較少的情況,可以考慮new arraylist(0)的初始化方法,容器容量增長比較緩慢,更省記憶體。

add(int index, e element)方法,在制定位置插入資料。

public void add(int index, e element) 

private void rangecheckforadd(int index)

複製**

boolean addall(collection<? extends e> c),插入集合。

public boolean addall(collection<? extends e> c) 

複製**

boolean addall(int index, collection<? extends e> c),在指定位置插入集合。

public boolean addall(int index, collection<? extends e> c) 

複製**

這兩個方法和上面的大同小異,只是先呼叫集合的c.toarray(),在呼叫native方法進行插入。不多贅述,進入下乙個版塊。

public e remove(int index) 

複製**

移除方法也很簡單,是將需要被移除的下標後面的元素整體前移,然後將末尾元素的置為null,讓gc**。

public boolean remove(object o) 

} else

}return

false;

}private void fastremove(int index)

複製**

可以看到,移除某個具體的元素就是遍歷整個陣列,根絕元素的equals方法判斷是否是同乙個元素,如果是,根據移除下標的方法移除即可.

對arraylist進行了一些基礎的分析,不是很詳盡,後續估計會補充,先更到這裡。

AbstractCollection原始碼分析

abstractcollection抽象類提供了collection的骨架實現,collection分析請看 這裡直接看它的 是如何實現的.public abstract iterator iterator 該方法沒有實現.public abstract int size 該方法沒有實現.publi...

ThreadPoolExecutor原始碼閱讀

執行緒池解決兩個問題 一是復用執行緒,減少建立銷毀執行緒帶來系統開銷 二是限定系統資源使用邊界,避免大量執行緒消耗盡系統記憶體 適用於互不依賴,執行時間短,不需要對執行緒控制操作的執行緒 新增任務時,1.若執行緒數量小於corepoolsize,則新增執行緒執行任務 2.若執行緒數量大於等於core...

OrangePi One Android 原始碼編譯

一 系統環境搭建參照 二 lichee原始碼編譯 1.檢視help build.sh h2.配置核心 cd linux 3.4 make arch arm menuconfig 進入配置頁面,上下移動列表,空格是選擇列表,左右移動選擇退出選項 3.首次編譯執行清除 在 lichee linux3.4...