在输入问题之前,我知道除了原始类型之外,所有内容都按其参考号存储。我的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
无法帮助进行深层复制,或者我可能会误解其他帖子。
答案 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()
。