Java 对于这个场景,重新实例化是如何工作的?

Java 对于这个场景,重新实例化是如何工作的?,java,arraylist,data-structures,Java,Arraylist,Data Structures,我正在使用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

我正在使用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));
    }   
  }  
}
公共类映射冲突{
公共静态void main(字符串[]args){
HashMapmap=newhashmap();
对于(int i=0;i<15;i++){
ArrayList lst=新的ArrayList();
1.添加(“某物”);
1.添加(“某物2”);
地图放置(i,lst);
}
对于(int j=0;j<11;j++){
System.out.println(map.get(j));
}   
}  
}
其工作方式是,每次循环时,它都会创建一个新的数组列表。这是我的问题,

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

其他问题:列表是否仅存在于范围内,即
for循环?
那么当我执行另一个(最后一个)for循环时,如何仍然可以访问

考虑指针,每次声明一个新的Arraylist时, 您正在新地址创建一个新的Arraylist,对吗

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

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

1问题 是的,您总是创建一个新对象,从而创建一个新地址

有关更多信息,请参见:

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

以下是有关对象生命周期的更多信息:

每次声明新的Arraylist时,都是在创建新的Arraylist Arraylist在一个新地址,对吗

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

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

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

如果不在
映射中添加每个新创建的
ArrayList
,您将无法访问创建它的第一个
for循环
之外的任何
ArrayList

考虑指针,每次声明一个新的Arraylist时, 您正在新地址创建一个新的Arraylist,对吗

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

其他问题:列表是否仅存在于范围内,即 for循环?那么当我做另一个的时候,isstill是如何访问的呢 (最后)循环

但是您将指针lst指向的对象分配到looop外部的地图Map。因此,该对象仍然存在,因为mapentry指向它


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

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

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

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

    从以上两点来看,所有ArrayList都可以通过HashMap值中的引用进行访问


现在你有5个问题的答案,考虑接受一个或评论什么是错的。因此,一般来说,如果我在局部范围内定义某个事物,但在某个范围之外的某物指向该项,该项(在局部范围中的一个)仍然存在吗?是的,只要任何变量指向一个对象,它仍然存活。如果没有,JavaGarbageCollector会在某个时候删除它(释放空间)。