【问题标题】:ArrayList inside an ArrayList in javajava中ArrayList中的ArrayList
【发布时间】:2020-10-14 03:15:20
【问题描述】:

我遇到了一个问题,我必须在 java 中使用嵌套的 ArrayList,并且必须在每次迭代后清除内部列表。我注意到,当我将内部列表添加到主列表并稍后清除内部列表时,主列表的值发生了变化。谁能解释为什么会这样。另外,如果我使用数组而不是 ArrayList,会有什么变化吗?我已将代码附加到下面的问题中以使其清楚。

import java.util.*;
import java.lang.*;
import java.io.*;

class Example
{


     public static void main(String []args){
        
        ArrayList<ArrayList<Integer>> list= new ArrayList<>();
        ArrayList<Integer> innerlist = new ArrayList<>();
        innerlist.add(1);
        list.add(innerlist);
        System.out.println(list);
        innerlist.clear();
        System.out.println(list);
}
 
}

输出: [[1]] [[]]

【问题讨论】:

    标签: java list arraylist


    【解决方案1】:

    发生这种情况是因为add 没有复制任何内容 - 它只是将您作为参数传递的对象的引用添加到列表末尾。如果您希望对innerlist 引用的更改根本不会影响您的list,则需要复制它,例如使用constructor taking a Collection parameter。您可以在添加时执行此操作

    list.add(new ArrayList<>(innerlist));
    

    或者您在添加后将innerlist 重新分配到新列表

    list.add(innerlist);
    innerlist = new ArrayList<>();
    

    尤其是如果您此时仍需要清除它。 另请参阅 this question,它处理相同的问题,但没有外部列表。

    【讨论】:

      【解决方案2】:

      innerlist 仍然指向 ArrayList。

      检查这个: What is the difference between a deep copy and a shallow copy?

      【讨论】:

        猜你喜欢
        • 2012-01-12
        • 1970-01-01
        • 1970-01-01
        • 2013-12-26
        • 1970-01-01
        • 1970-01-01
        • 2018-08-07
        • 2014-09-28
        • 1970-01-01
        相关资源
        最近更新 更多