List<List<Integer>> ArrayList 初始化不适用于新运算符 Java

Posted

技术标签:

【中文标题】List<List<Integer>> ArrayList 初始化不适用于新运算符 Java【英文标题】:List<List<Integer>> ArrayList initialization does not work with new operator Java 【发布时间】:2016-11-22 21:22:29 【问题描述】:

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

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 方法有什么问题吗?

【问题讨论】:

还有,[j]前面的x是做什么用的? new ArrayList&lt;&gt;(result) 只复制result 的浅表副本,即它复制“外部”列表,但不复制其元素。 【参考方案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】:

temp = new ArrayList&lt;&gt;(result) 只对result 进行浅拷贝,即它复制“外部”列表,而不是其元素。

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

因此,您添加到 temp.get(0) 的任何内容也会出现在 result.get(0) 中。

【讨论】:

您好,先生,如果您有时间,请您再看看我新的类似问题吗?我在帖子末尾更新了问题。【参考方案3】:

这是因为List&lt;List&lt;Integer&gt;&gt; temp = new ArrayList&lt;&gt;(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>> ArrayList 初始化不适用于新运算符 Java的主要内容,如果未能解决你的问题,请参考以下文章

如何为 List<List<List<Integer>>> nums = new ArrayList<List<List<Integer>&

List<Integer>list =new ArrayList<Integer>(); <Integer> 啥意思?

如何取出list数据放入map

将 List<List<Integer>> 转换为 int[][]

78. Subsets

Java如何把list数据导入txt文件?