2011-04-14 57 views
6

假設我有這種方式創建的ArrayList的ArrayList:ArrayList.clear()是否也刪除所有包含的對象?

ArrayList< ArrayList<String> > listOfListsOfStrings = 
           new ArrayList< ArrayList<String> >(); 

如果我稱之爲:

listOfListsOfStrings.clear(); 

將嘗試以後訪問任何字符串裏的listOfListsOfStrings總是結果在java.lang.NullPointerException

+1

試試看看會發生什麼。如果它不能按照你期望的方式工作,那麼請提供你的演示代碼來顯示問題。正如你所看到的答案是否定的,它不會引起異常。所以如果你得到一個異常,這意味着你有一個編碼問題,你不會進一步提出一個「假設」的問題。這就是爲什麼你應該總是自己嘗試。它應該少於10行代碼。 – camickr 2011-04-14 20:27:19

回答

3

不,只是引用將被清除。如果沒有對象的引用存在,它可能會被垃圾收集,但是你不會得到NPE,因爲無論如何你都無法獲得對該對象的新引用。

+0

謝謝。你的答案幫助我找到了這個令人難以置信的答案,這幫助我找到了一個令我瘋狂的bug的來源:http://stackoverflow.com/questions/333151/java-how-to-pass-byte-by-reference/333217 #333217事實證明,在Java中,我無法傳遞參考引用...所以,當我將一個ArrayList參數傳遞給要填充的超類方法時,實際上它正在填充不同的數組......現在一切都很順利。 – an00b 2011-04-15 01:11:49

+0

這篇文章或許可以幫助像我這樣的未來n00bs:http://javadude.com/articles/passbyvalue.htm – an00b 2011-04-15 01:12:41

+0

不客氣:)作爲一個邊節點,雖然Java是傳遞值,但真正的東西是什麼如果您使用對象作爲參數參考,則通過傳遞。因此,您可以將一個對象傳遞給方法並在那裏對其進行修改,但是不能在創建該對象時將其分配給傳遞的引用。就C/C++而言,您可以通過值傳遞一個指向對象的指針。 - 減少這些錯誤或使編譯器幫助你的一種可能性是將所有參數標記爲final(Eclipse可以自動執行此操作)。如果您然後爲參數賦予不同的值,編譯器將會抱怨。 – Thomas 2011-04-15 06:34:55

1

不,它不會刪除ArrayList中的對象,如果您仍然有外部引用。 ArrayList.clear()對被引用的對象不做任何處理,除非它們是孤立的,在這種情況下,以後你不會引用它們。

相關問題