在Java中有效地复制数组

时间:2015-04-30 21:11:35

标签: java object copy

在Java中,给定列表xs,我们可以获得列表ys,以便为ys的第n个元素赋予新值。 xs未被修改。是否可以在不复制所有xs的情况下完成此操作,将副本称为ys,然后修改ys

import java.util.ArrayList;
import java.util.List;

public class Main {

    public static void main(String[] args) {

        List<Integer> xs = new ArrayList<Integer>(100);

        xs.add(10);
        System.out.println(xs.get(0)); // prints 10

        destructiveCall(xs);
        System.out.println(xs.get(0)); // prints 5

        List<Integer> ys = nonDestructiveUpdate(xs);
        System.out.println(xs.get(0)); // prints 5 (the value has not changed)
        System.out.println(ys.get(0)); // prints 20 (the value set in the nonDestructiveUpdate)

    }

    private static void destructiveCall(List<Integer> xs) {
        xs.set(0, 5);
    }

    private static List<Integer> nonDestructiveUpdate(List<Integer> xs) {
        List<Integer> ys = new ArrayList<Integer>(xs);
        // is there a way of doing this without copying the whole list?
        ys.set(0, 20);
        return ys;
    }
}

2 个答案:

答案 0 :(得分:3)

您可以编写自己的类,其中包含“基本列表”(在您的情况下为xs)和另一个虚拟列表 - ys,您可以在其中跟踪更改。您可以为ys虚拟列表创建方法和迭代器,因此它可以显示为真实列表,即使它不是。

但是在标准库中,Java功能性我不知道这样的事情。

答案 1 :(得分:0)

目前尚不清楚你想要完成什么。如果要在不更新xs的情况下更新ys,则它们具有单独的状态。如果您担心要克隆的列表元素,它们将不会。但您可能希望复制引用,以便您可以非破坏性地操作它们。

如果你正在寻找ys来跟踪只有变化,那么@libik有一个很好的建议,但它会很快变得棘手,具体取决于你需要支持的操作(如果它只是更新,它赢了太难了,但插入/删除会更难。)