Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java:如何制作对象数组的副本?_Java_Arrays_Object - Fatal编程技术网

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

Java:如何制作对象数组的副本?,java,arrays,object,Java,Arrays,Object,现在,我有一个点对象数组,我想复制这个数组 我尝试过以下方法: 1) Point[]temp=mypointarray 2) Point[]temp=(Point[])mypointarray.clone() (三) 但所有这些方法都证明,只为temp创建mypointarray的引用,而不是副本 例如,当我将mypointarray[0]的x坐标更改为1(原始值为0)时,temp[0]的x坐标也更改为1(我发誓我没有触摸temp) 那么有什么方法可以复制点阵列呢 谢谢您必须自己创建所有点实例的

现在,我有一个点对象数组,我想复制这个数组

我尝试过以下方法:

1)
Point[]temp=mypointarray

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

(三)

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

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

那么有什么方法可以复制点阵列呢


谢谢

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


只要您的Point类是可序列化的,您就可以序列化并反序列化该数组以获得快速深度复制

您可以使用
数组
实用程序类:

import java.util.Arrays;
...
Point[] copy = Arrays.<Point>copyOf(mypointarray, mypointarray.length);
导入java.util.array;
...
Point[]copy=Arrays.copyOf(mypointarray,mypointarray.length);

您需要进行深度复制。这没有内置的实用程序,但很简单。如果
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
类是
java.awt.Point
,那么它确实实现了可序列化的.Arrays.copyOf()创建浅拷贝如果该类没有拷贝构造函数呢?@aniztar--,大概这个类提供了一些机制来复制一个实例(另一个构造函数;一个
copy()
方法;一个构建器类;序列化/反序列化;
clone()
;某物),所以只要在使用复制构造函数的地方使用任何可用的方法就行了。如果你没有办法复制一个实例,那么你就很不走运了。
Point[] temp = Arrays.stream(mypointarray)
                     .map(point -> point == null ? null : new Point(point))
                     .toArray(Point[]::new);
Point[] temp = Arrays.stream(mypointarray).map(Point::new).toArray(Point[]::new);