2010-07-20 70 views
2

我想做出一些在Object []一个深复制和ArrayList 我如何能做到这一点(不循环,并呼吁克隆)深复制[]和ArrayList的Java

有没有标准utils的为了做到这一点?

感谢 若昂

+0

深层副本将会有某种概念循环。问题是它是否隐藏在util内部的视图中。 – corsiKa 2010-07-20 15:52:15

+0

Dupe? http://stackoverflow.com/questions/64036/how-do-you-make-a-deep-copy-of-an-object-in-java – 2010-07-20 15:56:26

+0

你打算修改副本吗? – Arkadiy 2010-07-20 15:58:15

回答

2

无小事对象需要提供一些支持复制:即使是在实施克隆或序列化的形式。这或多或少是为什么没有内置方法,并且循环是不可避免的。

如果它是所有自己的代码,然后我会建议一个拷贝构造函数在任何克隆或序列化/反序列化,因为这是更面向对象;您要求对象创建自己的副本,而不是让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

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

否则,您将不得不自己实施深层复制。

+0

但我认为这比通过元素循环更糟糕吗? 问候 – 2010-07-20 15:54:27

+0

只有在ArrayList的内容是序列化的序列化 – naikus 2010-07-20 16:02:02

+0

会比手动循环慢,但要简单得多,特别是如果你有一个复杂的对象层次。 – codymanix 2010-07-20 16:52:55