[英]ArrayList in Arraylist remove method behavior
我有一个数组列表,看起来像:
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的所有ArrayList中的每个“ 1”都被删除,而不仅仅是第二个索引。 如何更改代码,以便仅删除第二个索引的“ 1”?
这是因为您将相同的ArrayList
实例存储在外部ArrayList
:
outerList = [instance1, instance2, instance2, instance2, ...]
当您从instance2删除第一个元素时,更改在所有其他索引中可见。
如果要避免这些问题,则应为每个子列表创建新实例,并复制原始列表中的元素。
matrix
可能包含对同一ArrayList
多个引用(包含[1、2、3、4、5、6、7、8、9])。
您在这里遇到引用和实例之间的区别。
当您将子ArrayList
添加到第一个中时,您实际要做的是将引用存储到列表中,然后该引用指向ArrayList
。
需要注意的是它甚至法律(但绝对不推荐)一个ArrayList
指定了正确的类型(例如ArrayList<?>
)有插入到列表本身的参考!
如果您多次存储同一ArrayList
,则它将复制并创建多个引用,但这些引用仍将指向同一Object 。
您需要创建一个新的ArrayList
(使用new
或诸如clone()
类的东西来创建子ArrayLists
,然后将新列表添加到原始列表中。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.