Arraylist中的ArrayList删除方法行为

时间:2014-03-14 11:20:16

标签: java arraylist remove-method

我有一个类似的arraylist:

private ArrayList<ArrayList<Integer>> matrix = new ArrayList<ArrayList<Integer>>(9);

它充满了这些元素:

[[7], [1, 2, 3, 4, 5, 6, 7, 8, 9], [1, 2, 3, 4, 5, 6, 7, 8, 9], [1, 2, 3, 4, 5, 6, 7, 8, 9], [3], [1, 2, 3, 4, 5, 6, 7, 8, 9], [4], [1, 2, 3, 4, 5, 6, 7, 8, 9], [9]]

现在我想从第二个索引中删除“1”,这样我想要的输出是:

[[7], [2, 3, 4, 5, 6, 7, 8, 9], [1, 2, 3, 4, 5, 6, 7, 8, 9], [1, 2, 3, 4, 5, 6, 7, 8, 9], [3], [1, 2, 3, 4, 5, 6, 7, 8, 9], [4], [1, 2, 3, 4, 5, 6, 7, 8, 9], [9]]

但是当我在表单中使用remove方法时:

matrix.get(1).remove(0);

输出结果为:

[[7], [2, 3, 4, 5, 6, 7, 8, 9], [2, 3, 4, 5, 6, 7, 8, 9], [2, 3, 4, 5, 6, 7, 8, 9], [3], [2, 3, 4, 5, 6, 7, 8, 9], [4], [2, 3, 4, 5, 6, 7, 8, 9], [9]]

您可以看到主ArrayList的所有ArrayLists中的每个“1”都被删除,而不是仅在第二个索引处。如何更改我的代码,只删除第二个索引的“1”?

3 个答案:

答案 0 :(得分:2)

这是因为您在外部ArrayList中存储了相同的ArrayList个实例:

outerList = [instance1, instance2, instance2, instance2, ...]

从instance2中删除第一个元素时,更改在所有其他索引中都可见。

如果您想避免这些问题,您应该为每个子列表创建新实例,并从原始列表中复制元素。

答案 1 :(得分:2)

可能matrix包含对同一ArrayList的几个引用(包含[1,2,3,4,5,6,7,8,9])。

答案 2 :(得分:0)

你在这里遇到引用和实例之间的区别。

当您将孩子ArrayList添加到第一个中时,您实际执行的操作是将引用存储到列表中,该引用然后指向ArrayList

请注意,对于指定了正确类型的ArrayList(例如ArrayList<?>)来说,它甚至是合法的(但绝对不推荐),以便将自己的引用插入到列表中!

如果您多次存储相同的ArrayList,那么它将复制并创建多个引用,但这些引用仍将指向相同的对象

您需要创建一个新的ArrayList(使用new或类似clone()的内容,以便创建子ArrayLists,然后将新列表添加到原始列表中。