所以我遇到的问题是在复制二维数组列表后,更改一个二维数组列表中的元素会影响另一个二维数组列表。我希望它们在内存中完全分开。
第一个示例展示了它如何正确处理一维数组列表......
import java.util.ArrayList;
public class QuickTest {
public static void main(String[] args) {
ArrayList<Integer> firstList = new ArrayList<>();
ArrayList<Integer> secondList = new ArrayList<>();
Integer counter = 2;
for(int arrI = 0; arrI < 4; arrI++, counter+=2){
firstList.add(counter);
}
secondList = new ArrayList<>(firstList);
System.out.println("firstList.get(2) = " + firstList.get(2));
System.out.println("secondList.get(2) = " + secondList.get(2));
firstList.set(2, 7);
System.out.println("firstList.get(2) = " + firstList.get(2));
System.out.println("secondList.get(2) = " + secondList.get(2));
}
}
预期输出:
请注意第一个 arraylist 中的元素如何更改,但第二个 arraylist 元素未更改。这很好,也是我们想要的。
现在尝试复制二维数组列表...
import java.util.ArrayList;
public class QuickTest {
public static void main(String[] args) {
ArrayList<ArrayList<Integer>> firstTwoDimList = new ArrayList<>();
ArrayList<ArrayList<Integer>> secondTwoDimList = new ArrayList<>();
firstTwoDimList.add(new ArrayList<Integer>());
firstTwoDimList.add(new ArrayList<Integer>());
firstTwoDimList.add(new ArrayList<Integer>());
Integer counter = 2;
for(int arrI = 0; arrI < firstTwoDimList.size(); arrI++, counter+=2){
firstTwoDimList.get(arrI).add(counter);
counter+=2;
firstTwoDimList.get(arrI).add(counter);
}
secondTwoDimList = new ArrayList<>(firstTwoDimList);
System.out.println("firstTwoDimList.get(1).get(0) = " + firstTwoDimList.get(1).get(0));
System.out.println("secondTwoDimList.get(1).get(0) = " + secondTwoDimList.get(1).get(0));
firstTwoDimList.get(1).set(0, 7);
System.out.println("firstTwoDimList.get(1).get(0) = " + firstTwoDimList.get(1).get(0));
System.out.println("secondTwoDimList.get(1).get(0) = " + secondTwoDimList.get(1).get(0));
}
}
意外的输出:
任何人都知道这是什么原因,最好的解决方案是什么?
就引用而言,这就是一维数组列表情况中发生的情况:
这是二维数组列表情况中发生的情况:
这意味着当您使用以下命令复制数组列表时:
new ArrayList<>(someOldArrayList)
项目本身不会被复制,只会创建一个新的数组列表对象,引用旧数组列表中的所有项目。
在第二种情况下,您仅更改数组列表 2 的项目,但第一个列表和第二个列表的索引 1 引用相同的数组列表 2。
要解决此问题,您还需要复制第一个列表和第二个列表中的数组列表。一种方法是:
secondList = new ArrayList<>(firstList.stream().map(x -> new ArrayList<>(x)).collect(Collectors.toList()));
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)