Java ArrayList(完全深度复制)

Java ArrayList(完全深度复制),java,arraylist,clone,deep-copy,copyonwritearraylist,Java,Arraylist,Clone,Deep Copy,Copyonwritearraylist,在进入问题之前,我知道除了原语类型之外,所有内容都是通过其引用号存储的。我的java代码结构是这样的。。。。。首先我有驾驶、预订和汽车课程。它们之间的关系是driver是执行预订的驱动程序,而存储在reservation类中的汽车被预订为要驾驶 司机将负责预订。汽车有一些基本类型的信息。可以将多辆车存储到保留原语和ArrayList中。但是驱动程序类中的一个驱动程序ArrayList可以有多个保留。因此,当我允许用户查看驱动程序保留中的内容时,我希望深入复制ArrayList中的所有内容,因为除

在进入问题之前,我知道除了原语类型之外,所有内容都是通过其引用号存储的。我的java代码结构是这样的。。。。。首先我有驾驶、预订和汽车课程。它们之间的关系是driver是执行预订的驱动程序,而存储在reservation类中的汽车被预订为要驾驶

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

无论如何,我会复制一份数组列表,以便在驱动程序类中保留

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

这是深度复制吗?如果我需要使用克隆

我该如何改进?克隆做浅拷贝,我不认为克隆可以帮助深度拷贝,否则我可能会误解其他帖子。

不,不是

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


如果引用类型具有所有基元类型,则可以在添加这些引用时调用Referencereferences.geti.clone。

除了引用列表之外,您的代码根本无法复制。它相当于一个班轮

copiedRef = new ArrayList<>(references);
克隆可以进行深度复制,它是专门为支持深度复制而设计的。只有对象中的默认实现执行浅层复制

然而,由于克隆合同的神秘要求和最终字段的限制,通常不建议使用克隆。您可以改为提供域类的副本构造函数


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

这是一个浅拷贝。你的参考类包含什么?
copiedRef = new ArrayList<>(references);