【问题标题】:Java: How to make a copy of an array of object?Java:如何制作对象数组的副本?
【发布时间】:2012-01-02 06:02:07
【问题描述】:

现在,我有一个 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);

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

比如我把mypointarray[0]的x坐标改成1(原来的值为0),temp[0]的x坐标也改成了1(我发誓我没碰temp) .

那么有什么方法可以复制Point数组吗?

谢谢

【问题讨论】:

标签: java arrays object


【解决方案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 而不是为@987654328 编写自己的lambda @:

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

【讨论】:

  • 如果类没有复制构造函数怎么办?
  • @aniztar -- 好吧,大概这个类提供了一些机制来复制一个实例(另一个构造函数;一个copy()方法;一个构建器类;序列化/反序列化;clone();某事)所以只要使用我使用复制构造函数的任何可用的东西。如果您无法制作实例的副本,那么您就很不走运了。
【解决方案2】:

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

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

【讨论】:

  • 如果Point类是java.awt.Point,那么它确实实现了Serializable。
【解决方案3】:

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

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

【讨论】:

  • Arrays.copyOf() 进行 shallow 复制
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-28
  • 2018-10-28
  • 2011-02-26
  • 1970-01-01
相关资源
最近更新 更多