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

最佳答案

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

但是在Java函数库的标准库中,我不知道类似这样的东西。

关于java - Java中数组的有效复制,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29977810/

10-12 00:20