使用Iterator将2种方法添加到Java ArrayList的区别

时间:2014-10-11 08:53:25

标签: java arraylist

有什么区别:

for (ArrayList<Integer> a : result)
    temp.add(new ArrayList<Integer>(a));

for (ArrayList<Integer> a : result)
    temp.add(a);

4 个答案:

答案 0 :(得分:1)

new ArrayList(a)实际上复制了您已有的Arraylist,请参阅javadoc of the constructor

所以当你有

ArrayList A = new Arraylist();
//fill the arraylist
ArrayList B = new ArrayList(a);

AB实际上包含相同的元素,但A == B将返回false

答案 1 :(得分:1)

for (ArrayList a : result) temp.add(new ArrayList(a));

ArrayList添加到包含temp元素的a。 请参阅:http://docs.oracle.com/javase/7/docs/api/java/util/ArrayList.html#ArrayList%28java.util.Collection%29

a中添加或删除内容不会更改添加到temp的列表的任何内容。

for (ArrayList a : result) temp.add(a);

a添加到temp。由于相同的引用,a的更改会影响添加到temp的列表。

答案 2 :(得分:1)

让我们从一个非常简单的例子开始:

final List<String> a = new ArrayList<>(Arrays.asList("a", "b", "c"));
System.out.println(a);

输出:

[a, b, c]

现在,让我们使用=

进行复制
final List<String> b = a;
b.add("d");
System.out.println(b);
System.out.println(a);
System.out.println(a == b);

输出:

[a, b, c, d]
[a, b, c, d]
true

好的,现在让我们使用new进行复制:

final List<String> c = new ArrayList<>(b);
c.add("e");
System.out.println(c);
System.out.println(b);
System.out.println(a);
System.out.println(c == b);

输出:

[a, b, c, d, e]
[a, b, c, d]
[a, b, c, d]
false

好的,所以当我们使用=进行复制时,我们将参考复制到相同的List 。当我们使用复制构造函数进行复制时,我们实际上会创建一个包含相同元素的完全独立的List

因此ab 引用到同一个列表,它们将始终返回相同的结果,a上的任何操作都会影响{{ 1}} - 将它们视为其他实体的别名。

bc(以及此a的实体副本),我们构建了b实体并复制了new的内容进入它。

所以,回答你的问题;您的第一个方法会复制参考,而您的第二个方法会复制内容

答案 3 :(得分:0)

这是在迭代结果arraylist时添加一个带有in temp项的新Arraylist

 for (ArrayList a : result)
 temp.add(new ArrayList(a));

这是在迭代结果arraylist

时添加in temp
    for (ArrayList a : result)
 temp.add(a);