java - 将二维 ArrayList 复制为新的

标签 java arraylist

所以我遇到的问题是在复制 2d arraylist 之后,更改一个 2d arraylist 中的元素会影响另一个 2d arraylist。我希望它们在内存中完全分开。

第一个示例展示了它如何正确处理一维数组列表...

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));
    }
}

预期输出:

enter image description here

请注意第一个 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));
    }
}

意外的输出:

enter image description here

有人知道这是什么原因,最好的解决方案是什么?

最佳答案

根据引用,这是一维数组列表案例中发生的情况:

enter image description here

这是二维数组列表情况下发生的情况:

enter image description here

这意味着当您使用此复制数组列表时:

new ArrayList<>(someOldArrayList)

项目本身不会被复制,只会创建一个新的数组列表对象,引用旧数组列表中的所有项目。

在第二种情况下,您只是更改数组列表 2 的项目,但第一个列表和第二个列表的索引 1 引用相同的数组列表 2。

要解决此问题,您还需要复制第一个列表和第二个列表中的数组列表。一种方法:

secondList = new ArrayList<>(firstList.stream().map(x -> new ArrayList<>(x)).collect(Collectors.toList()));

关于java - 将二维 ArrayList 复制为新的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47879142/

相关文章:

java - NoSuchMethod 错误 Java 但方法存在

java - 如何在java中创建firebase管理员用户进行身份验证

java - 从一个类调用一个方法,该类是我创建了 ArrayList 的类的子类

java - Apache Camel - Exchange.getIn().getBody(ZipFile.class) 返回 NULL 但 Exchange.getOut().setBody(zipfile) 工作正常

java - 当我登录网站时,jsoup 不返回所有 cookie

java - 随机数生成问题

android - 从Kotlin Android中的Application变量创建单独的ArrayList

java - 从字符串创建子字符串数组

java - 检查字符串是否包含 arrayList 的任何成员

java - H2 中同一事务中切换两个唯一字段时违反唯一约束