我有一个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]]。有人可以告诉我我该怎么做以获得第二个输出?
答案 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
。
所以这里tt
和arr
指向相同的内存位置意味着如果你改变其中一个内容也会反映到其他内容。
答案 2 :(得分:0)
因为tt
仍指向同一个arraylist对象。它正在修改同一个对象。
解决方案: 通过复制旧列表并在该列表中添加项目然后将列表添加到主列表来创建新列表对象。
答案 3 :(得分:0)
List
是具有可变状态的对象。这意味着添加或删除项目将更改变量所指向的List
的状态。您可以创建一个arr = ArrayList<Integer>
,向其中添加值1, 2, 3
。然后,将此列表添加到bigArr
列表列表中。现在,bigArr
和arr
的第一个元素都指向同一个物理对象。从bigArr
检索并将其存储在tt
变量中的那一刻,您有三种方法可以访问同一列表。
您想要的是bigArr.get(0)
初始列表的新版本(副本),并将新值添加到该列表中。最简单的方法是在从ArrayList
检索时使用bigArr
的复制构造函数。这已在Smutje给出的答案中解释:
ArrayList<Integer> tt = new ArrayList<Integer> (arr);