ArrayList中为什么子列表和原始列表会互相影响,如何避免这种影响
在 Java 中,ArrayList.subList()方法返回的子列表并不是一个独立的副本,而是一个视图(view),它指向原始列表中的某个范围。这意味着对子列表的操作实际上会直接反映到原始列表上,因为它们共享相同的底层数据结构。
例如,在给出的代码片段中:
1 | List<Integer> integerList = new ArrayList<>(); |
当调用subList.set(0, 10)时,虽然操作的是子列表,但实际上是更改了原始列表integerList在对应索引位置上的值。
为了避免这种影响,如果你需要对列表的部分内容进行修改而不影响原始列表,可以创建子列表的一个深拷贝(deep copy)而不是使用视图。例如,你可以使用ArrayList的构造函数来复制子列表:
1 | List<Integer> independentSubList = new ArrayList<>(subList); |
现在,independentSubList是一个独立的列表,对其的任何修改都不会影响到原始列表integerList。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 From Zero to Hero!