我有一个类似的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”?
答案 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
,然后将新列表添加到原始列表中。