List<List<Integer>> ArrayList 初始化不适用于 new 运算符 Java
List<List<Integer>> ArrayList initialization does not work with new operator Java
这两天一直在为这个问题苦恼。这个问题来自我正在做的一些问题。基本上,当我使用
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.
为什么会这样?非常感谢。
更新:感谢大家回答我的问题。我了解到浅拷贝是原因。但是,我还是运行陷入了类似的问题。当我尝试在以下代码中更改温度时,结果已更新:
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.add(new ArrayList(list))?
这样的add方法有什么问题吗
这并不奇怪,因为您只有一个列表可以迭代。如果您添加第二个列表,您将看到第二个数字。
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]]
temp = new ArrayList<>(result)
仅对 result
进行浅表复制,即它复制 "outer" 列表,但不复制其元素。
temp.get(0) == result.get(0)
- 我不是说 equals
- 它们是完全相同的实例。
因此,您添加到 temp.get(0)
的任何内容也会出现在 result.get(0)
。
发生这种情况是因为 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
}
这两天一直在为这个问题苦恼。这个问题来自我正在做的一些问题。基本上,当我使用
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.
为什么会这样?非常感谢。
更新:感谢大家回答我的问题。我了解到浅拷贝是原因。但是,我还是运行陷入了类似的问题。当我尝试在以下代码中更改温度时,结果已更新:
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.add(new ArrayList(list))?
这样的add方法有什么问题吗这并不奇怪,因为您只有一个列表可以迭代。如果您添加第二个列表,您将看到第二个数字。
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]]
temp = new ArrayList<>(result)
仅对 result
进行浅表复制,即它复制 "outer" 列表,但不复制其元素。
temp.get(0) == result.get(0)
- 我不是说 equals
- 它们是完全相同的实例。
因此,您添加到 temp.get(0)
的任何内容也会出现在 result.get(0)
。
发生这种情况是因为 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
}