Java ArrayList.clear()函数

时间:2014-07-20 20:33:45

标签: java arraylist

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,...)丢失了,可以任何人解释原因?

3 个答案:

答案 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列表包含两个元素56

之后

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只有referencesprimitives,没有其他类型。

  

我该怎样做才能避免这种情况?复制临时名单?

为您想要的每个新列表创建一个新列表。而不是temp.clear()调用

temp = new ArrayList<>();

理想情况下,除非具有相同的目的,否则您不应该重复使用局部变量。

// don't use temp again.
List<Integer> temp2 = new ArrayList<>();

BTW我主张你重复使用可变对象来最大化性能。只有在测量了分配率的问题并且知道自己在做什么之后,才应该这样做。