2013-04-18 30 views
1

當我遇到一個我無法解決自己或在網上找到的問題時,我一直在使用HashMaps。java中的對象。他們沒有更多的分配給變量後會發生什麼?

HashMap<String,HashMap<String,String>> m= new HashMap<>(); 
HashMap<String,String> t = new HashMap<>(); 

t.put("test1","1"); 
m.put("h1",t); 

t = new HashMap<>(); 
t.put("test2,"2"); 
m.put("h2",t); 

System.out.println(m); 

這給了我{h1={test1=1}, h2={test2=2}} 這樣大的HashMap同時包含HashMaps這樣的數據。所以問題是,它只是複製較小的HashMaps的數據,或者做兩個「t」HashMaps留在JVM內存中,並且HashMap只是將我鏈接到它們?

+0

#2是答案。數據未被複制,m只是指向哈希映射的兩個實例。 t不指向前一個hashmap實例的事實並不會使其消失,如果其他人指向它(m) – TheZuck 2013-04-18 05:27:55

+0

[閱讀此](http://javarevisited.blogspot.com/2011/04/garbage -collection-in-java.html),然後閱讀更多內容。 – Dariusz 2013-04-18 05:31:09

回答

0

無論何時將t放入m中,都不會生成任何數據副本。相反,放置一個參考到子地圖。

您將t添加到m兩次。但是,每次t都指向不同的對象。因此,您最終得到兩個獨立的子地圖m

對比度此用下面的例子:

 t.put("subkey","old"); 
     m.put("h1",t); 
     m.put("h2",t); 
     t.put("subkey", "new"); 
     System.out.println(m); 

此打印出

{h1={subkey=new}, h2={subkey=new}} 

這裏,tm和點到相同的子地圖兩個鍵。當你改變一個,他們都改變。

0

Map coutains對象的引用。它內部包含一個Entry類的存儲桶,它包含鍵值對象引用。

HashMap m將包含您的第一個創建的哈希映射對h1和第二個哈希映射的引用aginst h2的對象引用。

0

Java中的所有東西都是一個指針或引用,所以對象保存在內存中,並且散列映射存儲引用,而不是複製實際數據。

大哈希映射包含對較小哈希映射的引用,因此垃圾回收器不會釋放內存。

1

您的大HashMap包含對HashMaps的引用。你所做的是改變了什麼HashMapt也指出了。

所以,作爲一個更直觀的例子可以說

t = 0x00000001 

當你把tmm現在看起來

m = {0x00000001} 

在這一點上兩者tm具有相同的HashMap引用,這意味着任何一個變化都會出現在另一個變化中。現在,當你去t = new HashMap<>()你實際上是重新分配是t

t = 0x00000002 

m仍然看起來像{0x00000001}所以你沒有失去你的第一個參考基準。而當你把tm第二次他們看起來像

t = 0x00000002 
m = {0x00000001, 0x00000002} 

所以最後,m仍包含這兩個HashMaps

0

HashMap中都將保留在內存中的參考。你可以用key h1和h2通過hashmap m來引用它們。數據不會從hashmaps複製,而是將對象的引用改爲hashmap key(即h1 & h2)。

相關問題