Java 为什么ArrayList.clear()/ArrayList.removeAll()正在清除我声明的两个列表?

Java 为什么ArrayList.clear()/ArrayList.removeAll()正在清除我声明的两个列表?,java,arraylist,Java,Arraylist,我必须返回ArrayList的ArrayList,因为它是预定义的。 我尝试了n行pascal三角形的代码: ArrayList<ArrayList<Integer>> a = new ArrayList<ArrayList<Integer>>(); ArrayList<Integer> b = new ArrayList<Integer>(); for(int i=1;i<=n;i++){ int c=1;

我必须返回ArrayList的ArrayList,因为它是预定义的。 我尝试了n行pascal三角形的代码:

ArrayList<ArrayList<Integer>> a = new ArrayList<ArrayList<Integer>>();
ArrayList<Integer> b = new ArrayList<Integer>();
for(int i=1;i<=n;i++){
    int c=1;
    //ArrayList<Integer> b = new ArrayList<Integer>(); I declared
    //the arraylist here to solve the problem
    // Place 1: b.clear()
    for(int j=1;j<=i;j++){
        b.add(c);
        c=(c*(i-j))/j;
    }
    a.add(b);
    // Place 2: b.clear();
}
return a;
预期产出: n=4:[1][11][12 1][13 1] 我想知道为什么我在以下位置放置clear函数时没有获得所需的输出: 第1位输出:[1 3 3 1][1 3 3 1][1 3 3 1][1 3 3 1]仅放在最后一行 位置2:[]无输出
removeAll的情况也是如此。

它是ArrayList的相同引用,即使您已清除它。因此,修改一个副本也会修改所有其他副本。您应该真正创建ArrayList的新实例,而不是清除它。修改代码如下:

ArrayList<ArrayList<Integer>> a = new ArrayList<ArrayList<Integer>>();
ArrayList<Integer> b;
for (int i = 1; i <= n; i++) {
    int c = 1;
    // ArrayList<Integer> b = new ArrayList<Integer>(); I declared
    // the arraylist here to solve the problem
    b = new ArrayList<Integer>(); // NEW INSTANCE INSTEAD OF CLEARING IT
    for (int j = 1; j <= i; j++) {
        b.add(c);
        c = (c * (i - j)) / j;
    }
    a.add(b);
}
return a;

不确定你是否理解这个问题 由于数组b是在for循环的外部声明的,因此在外部循环的每次迭代之后,使用相同的对象并继续使用旧值

要获得所需的输出,请在外循环中创建新的b对象

而不是

ArrayList<Integer> b = new ArrayList<Integer>();
for(int i=1;i<=n;i++){
试试这个

ArrayList<Integer> b = null;
for(int i=1;i<=n;i++){
b = new ArrayList<Integer>();
您只有一个ArrayList,并且有多个对它的引用。一个参考是b。其余的在a内。请参见: