【问题标题】:ArrayList (completely deep copy) [duplicate]ArrayList(完全深拷贝)[重复]
【发布时间】:2014-11-08 00:32:16
【问题描述】:

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

【问题讨论】:

  • 这是一个浅拷贝。你的 Reference 类包含什么?

标签: java arraylist clone deep-copy copyonwritearraylist


【解决方案1】:

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

copiedRef = new ArrayList<>(references);

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

但是,通常不建议使用clone,因为它对final 字段的合同要求和限制是晦涩难懂的。您可以改为提供域类的复制构造函数。

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

【讨论】:

    【解决方案2】:

    不,不是。

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-02-09
      • 1970-01-01
      • 1970-01-01
      • 2017-10-14
      • 1970-01-01
      • 1970-01-01
      • 2016-05-07
      • 2011-03-24
      相关资源
      最近更新 更多