Java ArrayList原始碼分析

2021-09-24 06:56:06 字數 2321 閱讀 5942

arraylist是我們非常常用的乙個集合,那麼arraylist是如何實現呢?

arraylistarraylist = new arraylist<>();

arraylist.add("hello");

if (arraylist.contains("hello"))

arraylist.remove("hello");

複製**

public

arraylist();

//儲存資料的集合

transient object elementdata; // non-private to simplify nested class access

//....

this.elementdata = defaultcapacity_empty_elementdata;

}複製**

從建構函式可以看出,現在我們的集合是乙個空集合,真正儲存資料的陣列也是乙個長度為0的陣列。

public

boolean

add(e e)

private

void

add(e e, object elementdata, int s)

複製**

乙個引數的add方法呼叫了private的add方法,在該方法中真正完成了向集合中新增元素。在新增元素的時候,如果size==儲存資料的陣列的長度,那麼就表明陣列已經存滿了,這時候就需要將原本的陣列進行擴張,如何擴張陣列是通過grow方法來實現的。

private object grow() 

private object grow(int mincapacity)

//計算新的擴張長度

private

intnewcapacity

(int mincapacity)

return (newcapacity - max_array_size <= 0)

? newcapacity

: hugecapacity(mincapacity);//極端情況,可以不考慮(幾乎不會走到這個分支)

}private

static

inthugecapacity

(int mincapacity)

複製**

grow 方法是實現arraylist長度可變的核心,其實現思想是

當陣列存放滿了的時候,就擴張陣列(當集合中的元素的數量越多的時候,擴張的幅度就越大。) 而擴張陣列是通過,建立新的陣列(長度等於擴張後的長度),然後將舊的陣列中的元素填充到新陣列中,這種方式來實現的。

contains也是arraylist集合非常常用的乙個方法,用來判斷集合中是否包含指定的元素。

public

boolean

contains

(object o)

public

intindexof

(object o)

intindexofrange

(object o, int start, int end)

}} else }}

return -1;

}複製**

contains方法最終呼叫了呼叫了indexofrange方法,indexofrange做的工作是,在集合指定的範圍內判斷是否包含指定的元素,如果包含就返回下標,否則就返回-1.

public

boolean

remove

(object o)

else

return

false;

}//移除元素

fastremove(es, i);

return

true;

}private

void

fastremove

(object es, int i)

複製**

remove方法的邏輯很清晰:

首先找到需要移除的元素的下標

判斷下標是否是在集合的中間

如果下標在集合的中間,那麼表明需要將該下標後面的元素全部向前移動一位下標。

將陣列的最後乙個元素設定為null

arraylist通過陣列實現了可變集合,但是我們從原始碼中可以看出來,如果要增加刪除元素的話,是非常消耗資源和時間的(因為在頻繁的運算元組),但是訪問的時候是特別的快的(直接通過下標訪問即可)。

可以得出結論: 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...