现在,我有一个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数组的副本?
由于
答案 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);