列表<列表<整数>&GT; ArrayList初始化不适用于新的运算符Java

时间:2016-07-19 20:15:58

标签: java for-loop arraylist initialization variable-assignment

我已经在这个问题上苦苦挣扎了两天。这个问题来自我正在做的一些问题。基本上,当我使用

List<List<Integer>> temp = new ArrayList<>(result);

创建结果的新ArrayList副本,当我尝试在高级for循环中更改temp时,结果将会更改。例如,

List<List<Integer>> result = new ArrayList<>();
result.add(new ArrayList<>());
List<List<Integer>> temp = new ArrayList<>(result);
int j = 0;
for (List<Integer> list: temp) {
    list.add(x[j]);
    j ++;
}

我对循环内部的结果没有做任何事,但结果以[[1]]结束,这与temp相同。

为什么会这样?非常感谢。

更新:感谢大家回答我的问题。我学习浅拷贝是原因。但是,我仍遇到类似的问题。当我尝试在以下代码中更改temp时,结果会更新:

List<List<Integer>> result = new ArrayList<>();
result.add(new ArrayList<>());
List<List<Integer>> temp = new ArrayList<>();
for (List<Integer> list: result) {
    list.add(10000);
    temp.add(new ArrayList(list));
}

我不知道为什么结果会变成[[10000]]和temp。像temp.add(new ArrayList(list))这样的add方法有什么问题吗?

3 个答案:

答案 0 :(得分:4)

这种情况正在发生,因为List<List<Integer>> temp = new ArrayList<>(result);语句只复制顶级列表。它将是新列表,其中包含对原始result中原始项(也称为子列表)的引用。

您可以使用深层副本修复此问题:

List<List<Integer>> temp = new ArrayList<>(); // empty list
for (List<Integer> sublist : result) {
    temp.add(new ArrayList<Integer>(result)); // copying a sublist and adding that
}

答案 1 :(得分:1)

这并不奇怪,因为您只有一个列表可供迭代。如果您添加第二个列表,您将看到第二个数字。

int[] x = new int[]{1,2,3,4,5}; 

    List<List<Integer>> result = new ArrayList<>();
    result.add(new ArrayList());
result.add(new ArrayList());
    List<List<Integer>> temp = new ArrayList<>(result);
    for (Integer xx: x) {
        result.add(new ArrayList(xx));
    }
    System.out.println(result.toString());

如果您尝试此代码,它会显示:

[[1],[2]]

答案 2 :(得分:1)

temp = new ArrayList<>(result)只有result的浅表副本,即它复制“外部”列表,但不复制其元素。

temp.get(0) == result.get(0) - 我的意思并不是equals - 它们是完全相同的实例。

因此,您添加到temp.get(0)的任何内容也会显示在result.get(0)