有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

现在,我有一个点对象数组,我想对该数组进行复制

我尝试过以下方法:

1)Point[] temp = mypointarray;

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

(三)

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)

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

谢谢


共 (3) 个答案

  1. # 1 楼答案

    你需要做一份深度拷贝。这没有内置的实用程序,但很简单。如果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);
    
  2. # 2 楼答案

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

    import java.util.Arrays;
    ...
    Point[] copy = Arrays.<Point>copyOf(mypointarray, mypointarray.length);
    
  3. # 3 楼答案

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

    只要您的Point类是可序列化的,就可以对该数组进行序列化+反序列化以获得快速深度拷贝