重新实例化如何适用于此方案



>我正在使用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));
    }   
  }  
}

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

考虑指针,当您每次声明新Arraylist<>时,您是在新地址创建新Arraylist,我说得对吗?

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

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/

当你声明一个新的 Arraylist 时<>每次,你都在创建一个新的 新地址的阵列列表我说得对吗?

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

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

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

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

考虑指针,当你声明一个新的 Arraylist 时<>每次, 您正在新地址创建一个新的数组列表,我说得对吗?

正确。

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

仅当没有指向对象的引用时,垃圾回收器才会自动释放该对象。在您的情况下,列表是在 map 中添加的,因此它不会被释放,因为有一个指向它的map元素。

考虑指针,当你声明一个新的 Arraylist 时<>每次, 您正在新地址创建一个新的数组列表,我说得对吗?

是的,您是正确的,指向列表 lst 的指针仅存在于第一个循环的范围内。

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

但是,您将指针 lst 指向的对象分配给了 looop 外部的地图地图中。因此,该对象仍然存在,因为映射条目指向它。

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

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

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

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

    从上述两点收敛,所有 arrayList 都可以从 HashMap 值中的引用中访问。

相关内容

最新更新