Java:如何制作一个对象数组的副本?

时间:2011-11-20 06:43:56

标签: java arrays object

现在,我有一个Point对象数组,我想制作该数组的 COPY

我尝试过以下方法:

1)Point[] temp = mypointarray;

2)Point[] temp = (Point[]) mypointarray.clone();

3)

Point[] temp = new Point[mypointarray.length];
System.arraycopy(mypointarray, 0, temp, 0, mypointarray.length);

但所有这些方式都证明只有mypointarray的引用是为temp创建的,而不是副本。

例如,当我将mypointarray [0]的x坐标更改为1(原始值为0)时,temp [0]的x坐标也会更改为1(我发誓我没有触摸temp)

那么有没有办法制作Point数组的副本?

由于

3 个答案:

答案 0 :(得分:17)

您需要制作一份深层副本。没有内置的实用程序,但它很容易。如果Point有一个复制构造函数,你可以这样做:

Point[] temp = new Point[mypointarray.length];
for (int i = temp.length - 1; i >= 0; --i) {
    Point p = mypointarray[i];
    if (p != null) {
        temp[i] = new Point(p);
    }
}

这允许空数组元素。

使用Java 8,您可以使用流更紧凑地执行此操作:

Point[] temp = Arrays.stream(mypointarray)
                     .map(point -> point == null ? null : new Point(point))
                     .toArray(Point[]::new);

如果您确保mypointarray的任何元素都不是null,那么它可以更紧凑,因为您可以取消null测试并使用Point::new代替为map()编写自己的lambda:

Point[] temp = Arrays.stream(mypointarray).map(Point::new).toArray(Point[]::new);

答案 1 :(得分:0)

您必须自己创建所有Point实例的副本......

只要您的Point Class可序列化,您就可以序列化+反序列化该数组以获得快速深层复制

答案 2 :(得分:-3)

您可以使用Arrays实用程序类:

import java.util.Arrays;
...
Point[] copy = Arrays.<Point>copyOf(mypointarray, mypointarray.length);
相关问题