2013-08-06 21 views
0

我有兩個包含HashMap定義如下:爲什麼此HashMap被作爲引用傳遞

HashMap EventTable = new HashMap(); 
HashMap MainTable = new HashMap(); 

現在,假設我中插入一些數據事件表:

EventTable.put("name", "Test Event Name"); 

然後,假設我們插入事件表進入MainTable:

MainTable.put("table", EventTable); 

,然後打印出MainTable:

現在
{table={name=Test Event Name}} 

如果我修改事件表如下:

EventTable.put("more names", "More test events"); 

這改變了MainTable還有:

{table={more names=More test events, name=Test Event Name}} 

所以,很顯然,事件表是由參考MainTable通過。

我不明白爲什麼EventTable通過引用傳遞。

理想情況下,我想重用EventTable HashMap來創建其他條目,同時保留我的舊條目,所以我想通過值傳遞EventTable。

編輯:

忘記在主要問題提到這一點,但是當我添加一個字符串MainTable,當我後來修改字符串不會改變。那麼字符串的行爲如何呢?

+2

http://stackoverflow.com/questions/40480/is-java-pass-by-reference – assylias

+0

EventTable不通過引用傳遞 - 如果您重新分配EventTable與'EventTable = new HashMap'插入到MainTable中後,它不會更改MainTable的內容。 – assylias

+2

好吧,我想我明白了。 EventTable仍然指向與HashMap條目相同的位置,所以當我重新分配事件表時,它不再影響HashMap條目了,對嗎? – Chaos

回答

2

這是因爲,即使Java通過值傳遞所有參數,當您傳遞一個對象時,您確實會傳遞一個對象引用。如果您要將EventTable設置爲新的哈希表,則您傳遞給MainTable的那個不會更改。這篇文章可能有助於清除事情:http://javadude.com/articles/passbyvalue.htm

5

雖然我從來沒有使用原始類型和遵循Java命名約定,你可以做這樣的事情,讓您所需的行爲:

mainTable.put("table", new HashMap(eventTable)); 

爲了解決您的編輯:字符串是Java不變。

3

就像在@assylias中說的那樣,參數是按值傳遞的。

這裏HashMap不能複製日期,因爲它可能是任何東西。但您可以通過其構造函數創建一個新的HashMap

HashMap newHashMap= new HashMap(oldHashMap); 
相關問題