在寫**的時候,有時候遇到for迴圈,寫到下面的時候有一點猶豫。
list
datalist =..
.;for(data d : datalist)
}
產生上述疑問,究其原因在於對list原始碼不熟悉,雖然知道list介面有linkedlist(基於鍊錶實現)、arraylist(基於陣列實現)等實現類,但其執行add方法的細節沒關注,就會產生如題的疑惑。本文先得出結論,最後再去分析其中的原因。
在本地寫test**,往list中add null物件,然後再做遍歷。
private
void
printlist()
system.out.
println
("------------------------");
for(integer d : datalist)
}}
測試函式輸出
1
null
null
------------------------
1
針對問題:list可以add(null)嗎?答案是肯定的,null物件是可以新增到列表中。這一點通過上述例子也很好理解。
理解此問題的關鍵點在於arraylist底層的原理,針對本問題重點在於:
/**
* this helper method split out from add(e) to keep method
* bytecode size under 35 (the -xx:maxinlinesize default value),
* which helps when add(e) is called in a c1-compiled loop.
*/private
void
add(e e, object[
] elementdata,
int s)
/** *
* @return (as specified by )
*/public
boolean
add(e e)
hashmap底層是由陣列、鍊錶、紅黑色組成。陣列的下標通過key值決定,
node
table;
// key為null時,雜湊值為0
static
final
inthash
(object key)
// 陣列下標計算方式
tab[i =
(n -1)
& hash
hashtable底層是由陣列、鍊錶組成。陣列的下標通過key值決定,
public
synchronized v put
(k key, v value)
// key為null的話,key.hashcode()就會報nullpointerexception
// makes sure the key is not already in the hashtable.
entry<?,
?> tab[
]= table;
int hash = key.
hashcode()
;int index =
(hash &
0x7fffffff
)% tab.length;
@suppresswarnings
("unchecked"
)entry
entry =
(entry
)tab[index]
;for
(; entry != null ; entry = entry.next)
}addentry
(hash, key, value, index)
;return null;
}
參考
1、
List的add方法剖析
class1 using system using system.collections.generic using system.linq using system.text using system.threading.tasks namespace new乙個例項 using system u...
List 的add 與addAll 的區別
add 是將傳入的引數作為當前list中的乙個item儲存,即使你傳入乙個list也只會另當前的list增加1個元素 addall 是傳入乙個list,將此list中的所有元素加入到當前list中,也就是當前list會增加的元素個數為傳入的list的大小 即addall collection c a...
list的add 方法與addAll 方法簡介
簡單描述 月讀別人的 發現了乙個有意思的東西,list的乙個方法,addall 然後就去度娘了一下,發現這個還挺有用的。吐槽一下 為什麼自己沒發現這個方法呢?因為平時自己寫list的時候,基本上都是手敲上去的list.add 提示都沒有仔細看,其實這是個挺壞的習慣,因為 提示會給出相關的方法,對於自...