繁体   English   中英

Arraylist中的ArrayList删除方法行为

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM