我想制作一些Object[]和ArrayList的深层副本
这样做没有标准的功用吗?
谢谢若昂
发布于 2010-07-20 16:46:41
没有任何简单的对象需要提供一些来支持复制:即使这是以实现克隆或序列化的形式。这或多或少是为什么没有内置的方法,而循环是不可避免的。
如果这是您自己的代码,那么我建议使用一个复制构造函数,而不是克隆或序列化/反序列化,因为这是更多的OO;您要求对象创建自己的副本,而不是要求JVM执行低级别的复制。这样的代码非常简单,易于阅读,因此希望从长远来看,维护起来更便宜:
public class Widget {
private int x = 0;
public Widget(Widget copyMe){
this.x = copyMe.x;
// ...
}
// ....
}当然,仍然需要一个循环来循环旧集合,调用复制构造函数来填充新集合。有一本名为“有效Java”的书,其中详细介绍了我极力推荐的克隆和序列化的缺陷。
有些系统确实需要非常高速的复制和排序等(例如Hadoop)。这样的系统使开发人员有责任支持自定义二进制格式(例如byte[] getAsBytes() / public (byte[] fromBytes) )。将许多对象打包成一个更大的数组,就意味着使用大数组上的byte[]可以非常快地复制它们。JVM将把System.arraycopy作为一个低级内存副本执行。您仍然需要循环来从拷贝后的字节块反序列化对象。
一般来说,编译器和jvm倾向于很好地优化基本代码,因此,除非您实际测量您有一个真实的、可测量的性能问题,否则一个非常简单的循环和一个非常可读的复制构造函数将是最好的长期方法。
发布于 2010-07-20 15:51:10
可以序列化整个数组,然后将其反序列化为一个新变量。这实际上是一种深层次的复制。
否则,您将不得不自己实现一个深度副本。
https://stackoverflow.com/questions/3291830
复制相似问题