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