我正在使用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循环?
答案 0 :(得分:2)
是的,您始终创建一个新对象,因此创建一个新地址。
有关详细信息,请参阅此处:https://docs.oracle.com/javase/tutorial/java/javaOO/objectcreation.html
只要至少有一个指向它的变量,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值中的引用访问