public static void main(String[] args) {
List<List<Integer>> list = new ArrayList<List<Integer>>(); // final list
List<Integer> l = new ArrayList<Integer>(); // l is list
List<Integer> m = new ArrayList<Integer>(); // m is list
List<Integer> temp = new ArrayList<Integer>();
l.add(1);
l.add(2);
l.add(3); // list l
m.add(4);
m.add(5);
m.add(6); // list m
temp.addAll(l); // add l to temp
list.add(temp);
System.out.println("temp: "+temp);
System.out.println("list: "+list);
temp.addAll(m); // add m to temp1
list.add(temp);
System.out.println("temp: "+temp);
System.out.println("list: "+list);
}
结果是
temp: [1, 2, 3]
list: [[1, 2, 3]]
temp: [1, 2, 3, 4, 5, 6]
list: [[1, 2, 3, 4, 5, 6], [1, 2, 3, 4, 5, 6]]
我认为应该是:
temp: [1, 2, 3]
list: [[1, 2, 3]]
temp: [1, 2, 3, 4, 5, 6]
list: [[1, 2, 3], [1, 2, 3, 4, 5, 6]]
为什么最后一个列表是[[1, 2, 3, 4, 5, 6], [1, 2, 3, 4, 5, 6]]
?
答案 0 :(得分:1)
我将你的temp1重命名为temp,以便正确编译。
这是因为当你第一次执行“list.add(temp);”时
list获取对temp的引用。因此,当temp的内容发生变化时,列表的内容也会发生变化。
public static void main(String[] args) {
List<List<Integer>> list = new ArrayList<List<Integer>>(); // final list
List<Integer> l = new ArrayList<Integer>(); // l is list
List<Integer> m = new ArrayList<Integer>(); // m is list
List<Integer> temp = new ArrayList<Integer>();
l.add(1);
l.add(2);
l.add(3); // list l
m.add(4);
m.add(5);
m.add(6); // list m
temp.addAll(l); // add l to temp1
list.add(temp); // list now references to temp. So when the content of temp is changed, the content of list also gets changed.
System.out.println("temp: "+temp);
System.out.println("list: "+list);
temp.addAll(m); // add m to temp. The content of temp is changed, so does the content of list
list.add(temp);
System.out.println("temp: "+temp);
System.out.println("list: "+list);
}
答案 1 :(得分:1)
list
列表以对同一列表(temp
)的两个引用结束。您可以通过创建第二个临时列表,向其添加temp
的内容,然后向其添加4,5和6,然后将该临时列表添加到list
来实现所需的行为。
答案 2 :(得分:0)
我假设代码中没有temp1变量,它与temp相同。 在第一次将“temp”添加到“list”之后,当您更改temp时,第一个元素的内容已更改,这让您感到惊讶。您缺少的是“list”是引用的列表,因此它的第一个元素是引用到“temp”,而不是其内容的副本。因此,只要“temp”发生变化,就会在打印输出中报告,即使“”列表“的内容没有改变。
你可以通过添加一些东西来检查这种行为,在打印之前“不要改变”列表“对”temp说“100”。你会看到100将出现在打印输出中。