List<List<Integer>> result = new ArrayList<List<Integer>>();
ArrayList<Integer> temp = new ArrayList<Integer>();
temp.add(5);temp.add(6);
result.add(temp);
temp.clear();
我编写了类似上面的代码,令我困惑的是当我调试代码时,我发现结果包含大小为1但是在应用clear函数后值(5,6,...)丢失了,可以任何人解释原因?
答案 0 :(得分:5)
您有列表清单。在此代码之后
List<List<Integer>> result = new ArrayList<List<Integer>>();
ArrayList<Integer> temp = new ArrayList<Integer>();
temp.add(5);temp.add(6);
result.add(temp);
情况看起来像这样
┌───> 5
result ─────> tmp ───┤
└───> 6
result
列表包含一个tmp
列表tmp
列表包含两个元素5
和6
之后
temp.clear();
情况变为
// ↓↓↓ `temp.clear()` affects only this list
result ─────> tmp
所以现在
tmp
列表为空result
仍然包含tmp
列表,这就是为什么它的大小为1 答案 1 :(得分:1)
这行代码
result.add(temp);
将temp
的引用添加到结果,下一行
temp.clear(); // <-- here
清除温度。我想你想要一份temp
的副本(以便你可以在不改变temp
的情况下清除result
),
result.add(new ArrayList<Integer>(temp)); // <-- copy temp.
然后清除temp
不会更改result
中的值。
答案 2 :(得分:1)
temp
是ArrayList对象的引用。
ArrayList<Integer> temp;
这将引用添加到结果列表中。
result.add(temp); // adds a copy of the reference, not a copy of the list.
这清除了原始且唯一的列表(除了result
列表)
temp.clear();
注意:Java只有references
和primitives
,没有其他类型。
我该怎样做才能避免这种情况?复制临时名单?
为您想要的每个新列表创建一个新列表。而不是temp.clear()调用
temp = new ArrayList<>();
理想情况下,除非具有相同的目的,否则您不应该重复使用局部变量。
// don't use temp again.
List<Integer> temp2 = new ArrayList<>();
BTW我主张你重复使用可变对象来最大化性能。只有在测量了分配率的问题并且知道自己在做什么之后,才应该这样做。