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