Java:如何复制对象数组?

13

目前,我有一个点对象数组,我想要制作一个该数组的拷贝

我尝试了以下方式:

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

然而,所有这些方法都只是为temp创建了mypointarray的引用,而不是复制。

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

那么有没有办法复制Point数组?

谢谢


1
你现在做的是浅拷贝。你可以使用复制构造函数。请参考这个线程:https://dev59.com/PW865IYBdhLWcg3wLber - Umesh Awasthi
2
https://dev59.com/J3I95IYBdhLWcg3wyBGc#2156367 - Bozho
3个回答

21

你需要进行深度复制。没有内置的工具可以实现,但是很容易。如果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 而不是编写自己的 lambda 函数用于 map()

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

如果这个类没有拷贝构造函数会怎么样? - aniztar
@aniztar -- 嗯,假定该类提供了某种机制来复制实例(另一个构造函数;一个“copy()”方法;一个构建器类;序列化/反序列化;“clone()”;或其他什么),那么就使用我在使用复制构造函数的地方可用的任何东西。如果您无法复制实例,则基本上没办法了。 - Ted Hopp

0

你需要自己创建所有 Point 实例的副本...

只要你的 Point 类是可序列化的,你就可以将该数组序列化 + 反序列化以获得快速的深层副本。


如果“Point”类是“java.awt.Point”,那么它确实实现了Serializable。 - Ted Hopp

-3
你可以使用 Arrays 工具类:
import java.util.Arrays;
...
Point[] copy = Arrays.<Point>copyOf(mypointarray, mypointarray.length);

2
Arrays.copyOf() 会创建一个 浅拷贝 - dr.scre

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接