有什么区别:
for (ArrayList<Integer> a : result)
temp.add(new ArrayList<Integer>(a));
和
for (ArrayList<Integer> a : result)
temp.add(a);
答案 0 :(得分:1)
new ArrayList(a)
实际上复制了您已有的Arraylist,请参阅javadoc of the constructor
所以当你有
时ArrayList A = new Arraylist();
//fill the arraylist
ArrayList B = new ArrayList(a);
A
和B
实际上包含相同的元素,但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
。
因此a
和b
引用到同一个列表,它们将始终返回相同的结果,a
上的任何操作都会影响{{ 1}} - 将它们视为其他实体的别名。
b
是c
(以及此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);