Java 递归中ArrayList的ArrayList

Java 递归中ArrayList的ArrayList,java,recursion,arraylist,Java,Recursion,Arraylist,我一直在做一个更大的项目,遇到了一个问题,我在这里以更简单的方式复制了这个问题。我要做的是将一个整数数组列表添加到另一个数组列表中。问题是我添加到更大的ArrayList中的每个ArrayList都会更新,就好像它们都是一样的 public class RecursionTest { static ArrayList<Integer> test = new ArrayList<Integer>(); static ArrayList<ArrayList<Int

我一直在做一个更大的项目,遇到了一个问题,我在这里以更简单的方式复制了这个问题。我要做的是将一个整数数组列表添加到另一个数组列表中。问题是我添加到更大的ArrayList中的每个ArrayList都会更新,就好像它们都是一样的

public class RecursionTest {
static ArrayList<Integer> test = new ArrayList<Integer>();
static ArrayList<ArrayList<Integer>> test1 = new ArrayList<ArrayList<Integer>>();

public static void testRecurse(int n) {
    test.add(n);
    if (n % 2 == 0) {
        test1.add(test);
    }
    if (n == 0) {   
        for (ArrayList<Integer> a : test1) {
            for (Integer i : a) {
                System.out.print(i + "  ");
            }
            System.out.println();
        }
        return;
    }       
    testRecurse(n - 1);     
}

public static void main(String[] args) {        
    testRecurse(10);
}
}
何时应该:

10  
10  9  8  
10  9  8  7  6  
10  9  8  7  6  5  4  
10  9  8  7  6  5  4  3  2  
10  9  8  7  6  5  4  3  2  1  0   

有人能给我解释一下这里发生了什么事吗?并且可能建议解决这种情况。

您正在一次又一次地将完全相同的对象
test
添加到
ArrayList
中。这就是为什么他们都在一起修改

每次要添加它时,都需要在添加它之前创建一个
新的ArrayList()

你可以试着换一个

test1.add(test);

test=新数组列表(test);
test1.add(test);
这将创建当前测试的副本,然后将其添加到列表中


这仍然意味着
ArrayList
中包含的
Integer
元素将显示相同的bug,因为这是一个浅拷贝,但由于您没有修改它们,因此在这种情况下没有问题

好吧,这是有道理的。我无法理解为什么test1内部的测试会被更新,并且假设一个副本是自动生成的。我稍微修改了您的解决方案:arraylisttemp=newarraylist(test);测试1.添加(临时);这似乎输出了正确的数字。谢谢你的帮助@达斯汀良很高兴能为您提供帮助。
test1.add(test);
test = new ArrayList<Integer>(test);
test1.add(test);