public class ListMap {
HashMap<Integer, List> mp = new HashMap();
List myList = new ArrayList();
Integer x = 0;
Integer y = 5;
void test() {
for(Integer i = 0; i < 5; i++) {
x = y;
myList.add("check-1a" + i);
myList.add("check-1a" + i + 1);
y = null;
System.out.println(x); // output=5
mp.put(i, myList);
myList.clear();
}
}
1) 但是在使用 myList.clear()
清除列表后,Map 内的值也会被清除。
我的意思是说 map key
保留在那里,但它包含一个“空”列表
2)但是对于对象x
和y
,将y
设置为null
之后怎么会x
没有改变?
最佳答案
当您将对象添加到 map (或任何其他集合)时,您将添加对该对象的引用,而不是副本。当您随后对对象进行更改时,这些更改也将影响 map 中的引用。
当您想要存储列表的副本时,您需要创建一个新的
副本。这可以这样完成:
mp.put(i, new ArrayList(myList));
另一种(在我看来甚至更好)解决方案是在每次循环迭代开始时通过将其设置为新的列表对象来重新初始化 myList:
myList = new ArrayList();
myList.add("check-1a"+i);
myList.add("check-1a"+i+1);
mp.put(i,myList);
请注意,当您重新初始化变量 myList
时,列表不会被销毁。您可以想象生活在 map 内部的物体*。
*虽然技术上更准确的描述是“该对象存在于内存中,并且只要映射中仍然存储对其的引用,就不会被垃圾收集”
关于Java Collections HashMap,值意外变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28095434/