Deep Copy []和ArrayList Java

问题描述 投票:2回答:2

我想制作一些Object []和ArrayList的深层副本我该怎么做(没有循环,并且调用clone)

这样做没有标准的工具吗?

谢谢João

java arraylist deep-copy
2个回答
2
投票

没有一个简单的对象需要提供一些来支持复制:即使它是以实现Clone或Serialize的形式。这或多或少是为什么没有内置方法并且循环是不可避免的。

如果它是你自己的所有代码,那么我会推荐复制构造函数克隆或序列化/反序列化,因为它更多OO;您要求对象创建自己的副本,而不是要求JVM执行低级别的副本。这样的代码非常简单易读,因此从长远来看,希望维护成本更低:

public class Widget {
   private int x = 0;
   public Widget(Widget copyMe){
       this.x = copyMe.x;
       // ...
   }
   // ....
}

您仍然需要一个循环来循环调用复制构造函数来填充新集合的旧集合。有一本名为Effective Java的书,它详细介绍了我强烈推荐的克隆和序列化的缺陷。

有些系统确实需要非常高速的复制和排序等(例如Hadoop)。这样的系统将责任放在开发人员身上以支持自定义二进制格式(例如byte [] getAsBytes()/ public Widget(byte [] fromBytes))。将许多变成byte []的对象打包成一个更大的数组意味着可以使用大数组上的System.arraycopy一次快速地复制它们。 JVM将把System.arraycopy作为低级内存副本。在复制之后,您仍然需要循环从字节块中反序列化对象。

一般来说,编译器和jvm倾向于非常好地优化基本代码,所以除非你实际测量到你有一个真实且可测量的性能问题,否则一个非常简单的循环和一个非常易读的拷贝构造函数将是最好的长期方法。


2
投票

您可以序列化整个数组,然后将其反序列化为新变量。这有效地做了深刻的复制。

否则,您必须自己实施深层复制。

© www.soinside.com 2019 - 2024. All rights reserved.