-1

在输入问题之前,我知道除了原始类型之外,所有内容都由其参考号存储。我的 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对深拷贝没有帮助,否则我可能会误解其他帖子)。

4

2 回答 2

3

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

copiedRef = new ArrayList<>(references);

clone 可以进行深度复制,并且它是专门为支持这一点而设计的。只有默认实现Object会进行浅拷贝。

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

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

于 2014-09-14T09:27:24.427 回答
0

不它不是。

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

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

如果您的引用类型具有所有原始类型,则可以(Reference)references.get(i).clone()在添加这些引用时调用。

于 2014-09-14T09:26:33.350 回答