Java:如何制作对象数组的副本?
现在,我有一个点对象数组,我想复制这个数组 我尝试过以下方法: 1)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) 那么有什么方法可以复制点阵列呢 谢谢您必须自己创建所有点实例的
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);