如何重新实例化此方案的工作?

时间:2017-01-29 12:13:09

标签: 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<>();
      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。这是我的问题,

思考指针,当您每次声明新的Arraylist<>时,您正在新地址创建 Arraylist我正确?

其他问题:该列表是否仅存在于范围内,即for loop?那么当我执行其他操作时,仍然的可用性如何? (最后)for循环?

5 个答案:

答案 0 :(得分:2)

1问题

是的,您始终创建一个新对象,因此创建一个新地址。

有关详细信息,请参阅此处:https://docs.oracle.com/javase/tutorial/java/javaOO/objectcreation.html

2问题

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

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

答案 1 :(得分:2)

  

当您声明新的Arraylist&lt;&gt;时每一次,你都在创造一个新的   在新地址的Arraylist我是否正确?

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

  

列表中是否只存在列表,这是for循环?   那么当我做另一个(最后一个)循环时,仍然可以访问它是什么?

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

如果您未在ArrayList中添加每个新创建的map,则您无法访问第一个ArrayList之外的任何for-loop它被创造了。

答案 2 :(得分:1)

  

考虑指针,当你宣布一个新的Arraylist&lt;&gt;每一次,   你正在新地址创建一个新的Arraylist我是否正确?

正确。

  

列表是否仅存在于范围内,即for循环?   那么当我做另一个(最后一个)循环时,仍然可以访问它是什么?

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

答案 3 :(得分:0)

  

考虑指针,当你宣布一个新的Arraylist&lt;&gt;每一次,   你正在新地址创建一个新的Arraylist我是否正确?

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

  

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

但是您将指针 lst 指向的对象分配到了looop外部的Map map 。因此,对象仍然存在,因为木工指向它。

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

答案 4 :(得分:0)

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

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

  • 在第一个for循环运行期间,您已将hashmap的值条目指向每个单独的列表,并且显然可以访问超出for循环范围的散列映射。

    从以上两点进行融合,所有数组列表都可以通过HashMap值中的引用访问