>我正在使用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 值中的引用中访问。