Java ArrayList 独立副本

Java ArrayList independent copy

提问人: 提问时间:9/27/2021 最后编辑:Matt Ke 更新时间:10/5/2021 访问量:395

问:

我使用下面的方法制作了一个列表的副本,正如你所看到的输出,它们是独立的。我做错了什么吗?还是他们真的独立?因为我在互联网上做了一些研究,它告诉我这种方法应该通过引用传递(列表“a”和“copy”应该是依赖的)。

public static void main(String[] args) {
    ArrayList<String> a = new ArrayList<>(Arrays.asList("X", "X"));
    ArrayList<String> copy = new ArrayList<>(a);
    copy.set(0, "B");
    copy.remove(copy.size()-1);
    System.out.println(a);
    System.out.println(copy);
}

输出:

[X, X]
[B]
Java ArrayList 按引用传递

评论


答:

0赞 zysaaa 9/27/2021 #1

是的,此方法应通过引用传递(列表“a”和“copy”应依赖)。但这两项操作并不能证明这一点。

copy.set(0, "B");
copy.remove(copy.size()-1);

查看以下代码是否有助于理解:


    public static void main(String[] args) {
        Process process = new Process(1);
        Process process2 = new Process(2);
        ArrayList<Process> a = new ArrayList<>(Arrays.asList(process, process2));
        ArrayList<Process> copy = new ArrayList<>(a);
        copy.get(0).id = 10;

        // This proves that both ArrayLists maintain the same Process object at this point
        // output:
        // [Id:10, Id:2]
        // [Id:10, Id:2]
        System.out.println(a);
        System.out.println(copy);


        // copy.remove(copy.size() - 1) or copy.set(0, process3) doesn't affect another ArrayList
        Process process3 = new Process(3);
        process3.id = 100;
        copy.set(0, process3);
        copy.remove(copy.size() - 1);
        // output:
        // [Id:10, Id:2]
        // [Id:100]
        System.out.println(a);
        System.out.println(copy);

    }

    static class Process {
        public int id;

        public Process(int id) {
            this.id = id;
        }

        @Override
        public String toString() {
            return "Id:" + id;
        }
    }
1赞 Bohemian 9/27/2021 #2

根据文档ArrayList 复制构造函数:

构造一个列表,其中包含指定集合的元素,按照集合的迭代器返回这些元素的顺序。

修改一个列表对另一个列表没有影响,您的代码已确认这一点。