将Item添加到ArrayList的ArrayList

时间:2014-10-14 06:01:08

标签: java arraylist add

我有一个ArrayList的ArrayList,如下面的代码所示,我打算将一个项添加到现有的arraylist并保存它以及保留旧的arrayList。

    ArrayList<ArrayList<Integer>> bigArr = new ArrayList<ArrayList<Integer>> ();
    ArrayList<Integer> arr = new ArrayList<Integer> ();
    arr.add(1);
    arr.add(2);
    arr.add(3);
    bigArr.add(arr);
    ArrayList<Integer> tt = bigArr.get(0);
    tt.add(4);
    bigArr.add(tt);
    System.out.println(bigArr);

但问题是,它打印[[1,2,3,4],[1,2,3,4]]而不是[[1,2,3],[1,2], 3,4]]。有人可以告诉我我该怎么做以获得第二个输出?

4 个答案:

答案 0 :(得分:2)

创建两个列表,而不是重用第一个列表。

ArrayList<ArrayList<Integer>> bigArr = new ArrayList<ArrayList<Integer>> ();
ArrayList<Integer> arr = new ArrayList<Integer> ();
arr.add(1);
arr.add(2);
arr.add(3);
bigArr.add(arr);
ArrayList<Integer> tt = new ArrayList<Integer>(arr); // Create a new list based on the elements of the given list
tt.add(4);
bigArr.add(tt);
System.out.println(bigArr);

答案 1 :(得分:1)

  

Object类型参数的引用是按值传递但是    内存 指向的位置保持不变。因此,使用任何引用变量更改任何内容都会影响相同   Object

所以这里ttarr指向相同的内存位置意味着如果你改变其中一个内容也会反映到其他内容。

enter image description here

答案 2 :(得分:0)

因为tt仍指向同一个arraylist对象。它正在修改同一个对象。

解决方案: 通过复制旧列表并在该列表中添加项目然后将列表添加到主列表来创建新列表对象。

答案 3 :(得分:0)

List是具有可变状态的对象。这意味着添加或删除项目将更改变量所指向的List的状态。您可以创建一个arr = ArrayList<Integer>,向其中添加值1, 2, 3。然后,将此列表添加到bigArr列表列表中。现在,bigArrarr的第一个元素都指向同一个物理对象。从bigArr检索并将其存储在tt变量中的那一刻,您有三种方法可以访问同一列表。

您想要的是bigArr.get(0)初始列表的新版本(副本),并将新值添加到该列表中。最简单的方法是在从ArrayList检索时使用bigArr的复制构造函数。这已在Smutje给出的答案中解释:

ArrayList<Integer> tt = new ArrayList<Integer> (arr);