【问题标题】:Objects in java. What happens with them after they are no more assigned to a variable? [duplicate]java中的对象。在不再将它们分配给变量后它们会发生什么? [复制]
【发布时间】:2013-04-18 05:24:01
【问题描述】:

当我遇到一个我自己无法解决或在网络上找不到的问题时,我一直在使用 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 内存中,而 HashMap m 只是将我链接到它们?

【问题讨论】:

  • #2 就是答案。数据没有被复制,m 只是指向哈希映射的两个实例。 t 没有指向前一个 hashmap 实例的事实不会让它消失,如果其他人指向它 (m)
  • read this 然后阅读更多内容。

标签: java hashmap


【解决方案1】:

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

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

t = 0x00000001

当您将t 放入m 时,m 现在看起来像

m = {0x00000001}

此时tm 都引用了相同的HashMap,这意味着对其中一个的任何更改都会出现在另一个中。现在,当您转到 t = new HashMap&lt;&gt;() 时,实际上是在重新分配 t 指向的引用

t = 0x00000002

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

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

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

【讨论】:

    【解决方案2】:

    无论何时将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 的两个键都指向同一个子映射。当你改变一个时,它们都会改变。

    【讨论】:

      【解决方案3】:

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

      HashMap m 将包含您第一个创建的 hashmap 对 h1 的对象引用和第二个 hashmap 的引用 aginst h2。

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

          【解决方案5】:

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

          【讨论】:

            猜你喜欢
            • 2023-01-04
            • 2014-12-21
            • 1970-01-01
            • 2018-07-11
            • 2012-08-01
            • 2012-11-24
            • 2012-09-08
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多