3

我很难理解 Java 中“深拷贝”的概念。

假设我有一个包含各种参数的类“myClass”。我尝试编写一个方法“copy”,它应该返回这样的类的深层副本:

public myClass copy() {

    myClass deepCopy = new myClass();
    deepCopy.varA = varA;
    deepCopy.varB = varB;
    return deepCopy;

}

有人可以确认这是否确实是“深度复制”还是我做错了什么?

谢谢!

4

6 回答 6

1

如果您不想自己实现深拷贝,那么您可以进行序列化。它确实隐式地实现了深拷贝,并且优雅地处理了循环依赖关系。

可以在这里找到一篇关于深拷贝、克隆和浅拷贝的好文章。

于 2013-03-22T13:05:52.143 回答
0

如果 varA 和 VarB 是原始类型,这将只是一个深拷贝。如果它们是引用类型,那么您的新对象将指向这些类的与原始对象相同的实例。

实现深拷贝的一种简单方法是通过序列化。Apache commons lang 为此提供了一个实用方法(SerializationUtils.clone( foo ) )。

然而,它确实要求所有对象都是可序列化的。

如果您不是这种情况,XStream 可用于以最少的开发工作进行深度克隆。

http://x-stream.github.io/

于 2013-03-22T13:33:44.990 回答
0

除非:

  • 类“myClass”仅包含 varA 和 varB。
  • 类“myClass”没有超类。
  • 变量 varA 和 varB 是基本类型(即 String、int、long ......)。否则,您也必须对它们应用相同的复制过程。
于 2013-03-22T13:07:16.370 回答
0

在深拷贝中当复制的对象包含一些其他对象时,它的引用被递归复制

在这里查看更多

于 2013-03-22T13:10:44.590 回答
0

当一个对象连同它所引用的对象一起被复制时,就会发生深拷贝。

如果假设有一个MainObject1具有int 类型和ContainObject 类型MainObject字段的类型。当您对 MainObject1 进行深层复制时,将使用包含“field1”复制值的“field3”和包含 ContainObject1 复制值的“ContainObject2”创建 MainObject2。因此,在 MainObject1 中对 ContainObject1 所做的任何更改都将在 MainObject2 中。"field1""ContainObject1"not be reflected

在您的实现中,如果您尝试模拟深拷贝,那么您应该只有这两个变量:varA并且varB在您的原始类型类中。

于 2013-03-22T13:17:17.033 回答
-1

观察以下程序的输出。
1> 在没有 clone() 方法的情况下查看输出。从以下程序中删除 clone() 方法。(浅拷贝示例)
2> 使用 clone() 方法查看输出。(示例深拷贝。请参阅 ArrayList 对象的输出)

import java.util.ArrayList;
import java.util.List;

public class DeepCopy implements Cloneable {
    private List<String> hobbiesList;
    private int age;
    private String name;
    private float salary;

    public static void main(String[] args) throws CloneNotSupportedException {
        DeepCopy  original = new DeepCopy();
        original.name="AAA";
        original.age=20;
        original.salary=10000;
        original.hobbiesList = new ArrayList<String>();
        original.hobbiesList.add("Cricket");
        original.hobbiesList.add("Movies");
        original.hobbiesList.add("Guitar");
        original.hobbiesList.add("Eating");

        DeepCopy  cloned = (DeepCopy) original.clone();
        System.out.println("original:="+original);
        System.out.println("cloned  :="+cloned);
        System.out.println("After adding two more hobbies in 'original' which untimately reflected in 'cloned'");
        cloned.name="BBB";
        cloned.age=27;
        cloned.salary=18237;
        cloned.hobbiesList.add("Trecking");
        System.out.println("original       :="+original);
        System.out.println("cloned  changed:="+cloned);
    }
    @Override
    protected Object clone() throws CloneNotSupportedException {
        DeepCopy clone = (DeepCopy)super.clone();
        clone.hobbiesList = new ArrayList<String>(clone.hobbiesList);
        return clone;
    }
    @Override
    public String toString() {
        return "My name is (String)"+name + " having age (int)"+age+". I earned (float)"+salary+" and hobbies are (ArrayList)"+hobbiesList;
    }
}
于 2013-03-22T13:16:29.633 回答