列表,任何人都可以回答

时间:2015-09-26 05:15:50

标签: java list collections

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]]

3 个答案:

答案 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将出现在打印输出中。