JDK原始碼 輪子分析 ArrayList原理淺解

2021-08-14 16:02:20 字數 4618 閱讀 6612

arraylist 個人覺得比較容易理解一點,主要就是乙個正常的陣列。

public

class

arraylist

extends

abstractlist

implements

list, randomaccess, cloneable, serializable

else

if

(paramint

== 0)

else

}引數為陣列的開闢大小。  

public

arraylist()

不傳參則預設建立乙個空陣列(在你要存進陣列的時候才給你開闢出大小的)

public

arraylist

(collection<?

extends

e> paramcollection) }

else

}直接建立和指定集合一樣內容的

新增資料方法:

public

boolean

add(eparame)

不指定位置預設在陣列後面新增,效率是最高的時間複雜度為o(1),新增前檢查陣列大小是否夠用,不夠用就擴容。

public

void

add(

int

paramint

, eparame)

想知道這方法幹了啥,我覺得有必要弄清楚兩個東西:

private

void

rangecheckforadd

(int

paramint)

} 1.先檢查所新增資料的位置合不合理;

public

static

native

void

arraycopy(object

paramobject1

,int

paramint1

, object

paramobject2

,int

paramint2

,int

paramint3

); 這是乙個本地方法,是將

paramobject1陣列物件,從

paramint1位置開始複製

paramint3 個

到paramobject2陣列中,從

paramint2這個位置開始放。

system.

arraycopy

(this

.elementdata

,paramint

,this

.elementdata

,paramint

+ 1,

this

.size

-paramint

); 那麼上面這個做的就是將 

paramint開始位置到末尾的資料整體往後移,讓

paramint這位空出來讓add的值放進去。

public

boolean

addall

(collection<?

extends

e>

paramcollection)

這方法就比較容易理解了,前面是將單個資料新增到陣列中去,現在是將多個資料新增到陣列的末尾上去,只不過這多個資料是個集合的形式。

public

boolean

addall

(int

paramint

, collection<?

extends

e>

paramcollection)

system.

arraycopy

(arrayofobject

, 0,

this

.elementdata

,paramint,i

); this

.size+=i

; return

i!= 0;

} 這是乙個指定位置版的新增多個資料,可以模擬指定位置的新增單個資料版的方法,在此不多說。

獲取資料方法:

public

eget

(int

paramint)

比較簡單,因為物件是個陣列,最快且有效的方法當然是直接用下標了。

另外,每個集合類都會有乙個迭代器,用迭代器肯定也是可以獲取資料

……public

iteratoriterator()

其中itr是arraylist中維護的iterator 內部類。

我們主要看next()方法就可以知道是怎麼獲取資料的了。

public

e next()

object

arrayofobject

= arraylist.

this

.elementdata;

if

(i>=

arrayofobject

.length)

this

.cursor

= (i

+ 1);

return

arrayofobject

[(this

.lastret=i

)]; }

先獲取到arraylsit中維護的陣列,再取下標(跟get中一樣)。這個迭代器繞了一圈還是呼叫了get方法。

刪除資料方法:

public

eremove

(int

paramint)

this

.elementdata

[(--

this

.size

)] =

null

; return

localobject; }

這是根據陣列下標來刪除資料,很簡單,將要刪除的位置的後面的資料整體往前移一位即可,然後最後一位置空。最後返回你要刪除的資料。

public

boolean

remove

(object

paramobject)

} }else

} }

return

false

; }這是根據資料資料來刪除,要先遍歷陣列找到該物件,再進行刪除,這fastremove方法跟前面的remove是一樣的,不信你看

private

void

fastremove

(int

paramint)

this

.elementdata

[(--

this

.size

)] =

null

; }確實刪除了資料返回true,沒有則false。

修改陣列資料方法:

public

eset

(int

paramint

, eparame)

將指定下標位置中的資料替換即可,最後返回被替換的資料。

JDK原始碼分析 Vector

vector和arraylist有一定的不同 int newcapacity oldcapacity capacityincrement 0 capacityincrement oldcapacity 從這一句我們可以看出 增長容量 capacityincrement 0 增長倍數 陣列數量 舊容量...

JDK原始碼分析 Collections

1.集合框架圖 hashmap是通過 拉鍊法 實現的雜湊表。它包括幾個重要的成員變數 table,size,threshold,loadfactor,modcount。table是乙個entry陣列型別,而entry實際上就是乙個單向鍊錶。雜湊表的 key value鍵值對 都是儲存在entry陣列...

jdk原始碼分析之 HashTable

hashtable整體架構 hashtable實現雜湊表,該雜湊表將鍵對映到值。可以是任何不為空的key或者value。主要是因為hashtable的儲存或者檢索key必須實現hashcode 和equals方法,其類圖如下 類註解資訊 重要的成員變數 存放雜湊表的資料 private transi...