Java細節 List可以add null 嗎?

2021-09-24 01:21:23 字數 2026 閱讀 5187

在寫**的時候,有時候遇到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 提示都沒有仔細看,其實這是個挺壞的習慣,因為 提示會給出相關的方法,對於自...