【问题标题】:Add Item to the ArrayList of ArrayList将 Item 添加到 ArrayList 的 ArrayList
【发布时间】:2014-10-14 06:01:07
【问题描述】:

我有一个 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]]。有人可以告诉我该怎么做才能获得第二个输出吗?

【问题讨论】:

    标签: java arraylist add


    【解决方案1】:

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

    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);
    

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

          【解决方案4】:

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

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

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

          【讨论】:

            猜你喜欢
            • 2015-03-30
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-01-11
            • 1970-01-01
            • 2020-11-08
            相关资源
            最近更新 更多