1

当我遇到一个我自己无法解决或在网上找到的问题时,我一直在使用 HashMaps。

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 包含两个 HashMap 的数据。所以问题是它只是简单地复制了较小的 HashMap 的数据,还是两个“t”HashMap 都保留在 JVM 内存中,而 HashMapm只是将我链接到它们?

4

5 回答 5

1

您的 bigHashMap包含对两者的引用HashMaps。你所做的也改变了HashMap t指向的东西。

所以作为一个更直观的例子让我们说

t = 0x00000001

当你放入时tm现在m看起来像

m = {0x00000001}

此时两者tm都引用了相同的HashMap,这意味着对一个的任何更改都将出现在另一个中。现在,当你去的时候,t = new HashMap<>()你实际上是在重新分配t指向的引用

t = 0x00000002

m看起来{0x00000001}你仍然没有失去你的第一个参考。当你t进入m第二次时,它们看起来像

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

所以最后,m仍然包含对两者的引用HashMaps

于 2013-04-18T05:32:41.743 回答
0

每当您t放入m时,都不会复制数据。相反,会放置对子地图的引用。

你加tm两次。但是,每次都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}}

在这里,t并且两个键都m指向同一个子图。当你改变一个时,它们都会改变。

于 2013-04-18T05:26:54.350 回答
0

Map可以引用您的对象。它内部包含Entry类的数组桶,其中包含键、值对象引用。

HashMapm 将包含您第一个创建的哈希映射对 h1 的对象引用和第二个哈希映射的引用 aginst h2。

于 2013-04-18T05:27:02.687 回答
0

Java 中的一切都是指针或引用,因此对象保存在内存中,哈希映射存储引用,而不是复制实际数据。

大哈希映射包含对较小哈希映射的引用,因此垃圾收集器不会释放内存。

于 2013-04-18T05:30:35.937 回答
0

两个 HashMap 都将保留在内存中。您可以通过带有键 h1 和 h2 的 hashmap m 引用它们。数据不会从哈希映射中复制,但对象的引用更改为哈希映射键(即 h1 和 h2)。

于 2013-04-18T05:32:48.463 回答