繁体   English   中英

Deep Copy []和ArrayList Java

[英]Deep Copy [] and ArrayList Java

我想对某些Object []和ArrayList进行深层复制 ,我该怎么做(没有循环,也没有调用clone)

没有标准的工具来做到这一点?

感谢João

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

否则,您将必须自己实施一个深层副本。

琐碎的对象都不需要提供某些东西来支持复制:即使是以实现克隆或序列化的形式。 这或多或少是为什么没有内置方法并且循环不可避免的原因。

如果所有代码都是您自己的,那么我建议您在克隆或序列化/反序列化上推荐一个复制构造函数,因为这样做比较OO。 您要求对象创建自己的副本,而不是让JVM执行低级副本。 这样的代码非常简单易读,因此从长远来看希望维护起来便宜:

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

当然,您仍然需要循环来遍历旧集合,并调用复制构造函数来填充新集合。 有一本名为《有效的Java》的书,详细介绍了我强烈建议的克隆和序列化的陷阱。

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

通常,编译器和jvm往往会很好地优化基本代码,因此,除非您实际测量出存在真实且可衡量的性能问题,否则使用可读性强的复制构造函数进行非常简单的循环将是最佳的长期方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM