ArrayList(完全深拷贝)

时间:2014-09-14 09:20:57

标签: java arraylist clone deep-copy copyonwritearraylist

在输入问题之前,我知道除了原始类型之外,所有内容都按其参考号存储。我的java代码结构是这样的.....首先我有司机,预订和汽车类。他们之间的关系是司机是进行预约的驾驶员,并且预订车被预订被存储在预订等级中。

司机将负责预订。汽车有一些原始类型的信息。可以将多辆车存储到预订中(原始和ArrayList)。但是一个驱动程序(ArrayList)(来自驱动程序类)可以有多个保留。因此,当我允许用户查看其预订中的驱动程序时,我想深入复制ArrayList中的所有内容,因为除基本类型之外的所有内容都是参考编号。

无论如何,我会在驱动程序类中制作一个数组列表的副本。

在我的驱动程序类中,这是一个访问者,当它传递ArrayList时,我尝试深度复制并传递ArrayList

public ArrayList<Reference> getReference() {    

    copiedRef = new ArrayList<Reference>();

    //references have been declared above
    for (int i = 0; i < references.size(); i++) {
        copiedRef.add(references.get(i));
        //getting each element in the arrayList one by one and push to a new ArrayList
    }

    return copiedRef;
}

这是做深拷贝吗?如果我需要使用clone()

我如何改善? (clone执行浅层复制,我认为clone无法帮助进行深层复制,或者我可能会误解其他帖子。

2 个答案:

答案 0 :(得分:3)

除了引用列表之外,您的代码完全没有复制。它相当于单线

copiedRef = new ArrayList<>(references);

clone 可以进行深层复制,它专门用于支持。只有Object中的默认实现才能进行浅层复制。

但是,由于其clone字段的合并要求和限制,通常不建议使用final。您可以改为提供域类的复制构造函数。

通常,最简单的方法(涉及最少的代码)实现深度复制是通过内存中的序列化 - 反序列化循环。只注意在这种情况下,&#34;表现&#34;是一个肮脏的词:)

答案 1 :(得分:0)

不,不是。

copiedRef.add(references.get(i));

上面的代码获取Reference类型的每个对象,并将引用存储到这个新的arraylist中(复制Ref)。您基本上需要创建一个与每个references.get(i)对象具有相同状态的新实例。

如果您的参考类型具有所有基本类型,则可以在添加这些参考时调用(Reference)references.get(i).clone()