【问题标题】:How does re instantiating work for this scenario?在这种情况下,重新实例化如何工作?
【发布时间】:2017-01-29 12:13:09
【问题描述】:

我正在使用 Java

public class MapsConfusion {
  public static void main(String[] args) {
    HashMap< Integer, ArrayList<String>> map = new HashMap<>();
    for (int i = 0; i < 15; i++){
      ArrayList<String> lst = new ArrayList<>();
      lst.add("something");
      lst.add("something2");
      map.put(i, lst);
    }
    for(int j = 0; j < 11; j++){
      System.out.println(map.get(j));
    }   
  }  
}

它的工作方式是,每次循环时都会创建一个 new 数组列表。这是我的问题,

考虑指针,当你每次声明一个新的Arraylist&lt;&gt; 时,你是在一个新的地址创建一个新的 Arraylist,对吗?

其他问题:列表不只存在于for loop?的范围内,那么当我做另一个时,仍然如何访问(最后) for 循环?

【问题讨论】:

  • 现在您有 5 个问题的答案,考虑接受一个或评论缺少的内容。

标签: java arraylist data-structures


【解决方案1】:

1 个问题

是的,您总是会创建一个新对象,从而创建一个新地址。

更多信息请参见:https://docs.oracle.com/javase/tutorial/java/javaOO/objectcreation.html

2 个问题

只要至少有一个变量指向它,ArrayList 就存在。在这种情况下,只要 map 存在并且 main 方法运行。

这里有更多关于对象生命周期的信息:http://www.dummies.com/programming/java/the-life-cycle-of-a-java-object/

【讨论】:

  • 所以一般来说,如果我在本地范围内定义了一些东西,但在范围之外有东西指向该项目,那么该项目(本地范围内的一个)仍然存在吗?
  • 是的,只要任何变量指向一个对象,它就会保持活动状态。如果没有,Java GarbageCollector 会在某个时间将其删除(释放空间)。 dynatrace.com/resources/ebooks/javabook/…
【解决方案2】:

当你每次声明一个新的 Arraylist 时,你就是在创建一个新的 新地址的 Arraylist 是否正确?

是的,你是对的。每个ArrayList都在一个新的内存位置创建。

列表不只存在于for循环的作用域内吗? 那么当我执行另一个(最后一个)for 循环时,如何仍然可以访问?

它是可访问的,因为每个新创建的 ArrayList 都会添加到您的 map 中,这就是为什么当您的第一个 for loop 结束时您不会丢失它。

如果您不将每个新创建的ArrayList 添加到您的map 中,您将无法访问创建它的第一个for-loop 之外的任何ArrayList

【讨论】:

    【解决方案3】:

    考虑指针,当你每次声明一个新的Arraylist时, 你是在一个新地址创建一个新的 Arraylist 对吗?

    正确。

    列表不只存在于for循环的作用域内吗? 那么当我执行另一个(最后一个)for 循环时,如何仍然可以访问?

    只有在没有指向它的引用时,垃圾收集器才会自动释放对象。在您的情况下,列表被添加到map,因此它不会被释放,因为map 的元素指向它。

    【讨论】:

      【解决方案4】:

      考虑指针,当你每次声明一个新的Arraylist时, 你是在一个新地址创建一个新的 Arraylist 对吗?

      是的,你是正确的,指向 List lst 的指针只存在于第一个循环的范围内。

      其他问题:列表不只存在于范围内吗? for循环?那么当我做另一个时如何仍然可以访问 (最后)for循环?

      但是您将指针 lst 指向的对象分配到循环外的 Map ma​​p 中。因此该对象仍然存在,因为 mapentry 指向它。

      如果将地图也移动到第一个循环中,则会出现编译错误。

      【讨论】:

        【解决方案5】:

        由于您尚未删除对 arrayList 的所有引用,因此它仍然存在并且在第一个 for 循环之后仍然可以访问。根本区别在于:

        • 您在 for 循环中声明的任何变量/指针都无法访问 arrayList,因为这些变量仅在第一个 for 循环的范围内。

        • 在第一个 for 循环运行期间,您已将哈希图的值条目指向每个单独的列表,显然哈希图可以在 for 循环范围之外访问。

          从以上两点收敛,所有的arrayLists都可以通过HashMap的value中的引用来访问

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-05-25
          • 1970-01-01
          • 2018-06-16
          • 2017-06-21
          • 2018-01-19
          • 1970-01-01
          • 2021-12-06
          • 2020-12-27
          相关资源
          最近更新 更多