3

我对java中的对象克隆有点困惑。浅克隆和深克隆的主要区别是什么?

哪个更好?

4

7 回答 7

15

浅克隆和深克隆的主要区别是什么?

浅克隆复制树的顶层,但从顶层指向的任何内容(例如,对象属性)仍然由两个副本共享。深度克隆复制树的所有级别,在源和副本之间不留任何链接。

例如,假设您有一个Person带有spouse属性的对象 (a),它也是一个Person对象:

+--------------+
| 人:一个 |
+--------------+
| 姓名:“乔” |               
| 配偶|------------->+----------------+
+--------------+ | 人 |
                              +---------------+
                              | 名称:“玛丽” |
                              +---------------+

如果您对to进行浅层克隆,则两者和从它们的属性中指向相同:abab Personspouse

+--------------+
| 人:一个 |
+--------------+
| 姓名:“乔” |               
| 配偶 |------+
+--------------+ |        
                     |
+-------------+ +------->+----------------+
| 人: b | +------->| 人 |
+--------------+ | +---------------+
| 姓名:“乔” | | | 名称:“玛丽” |
| 配偶 |------ +----------------+
+--------------+       

如果您进行深度克隆,您不仅可以克隆ab,而且还可以克隆a.spouseb.spouse,这样他们每个人最终都会拥有自己副本。

+--------------+
| 人:一个 |
+--------------+
| 姓名:“乔” |               
| 配偶|------------->+----------------+
+--------------+ | 人 |
                              +---------------+
+--------------+ | 名称:“玛丽” |
| 人: b | +---------------+
+--------------+       
| 姓名:“乔” |       
| 配偶|------------->+----------------+
+--------------+ | 人 |
                              +---------------+
                              | 名称:“玛丽” |
                              +---------------+

哪个更好?

两者都不。两者都有用处,都可能被滥用。

于 2013-10-04T08:01:24.323 回答
3

在浅克隆中,克隆的类不会复制其内部对象,但在深度克隆中,类的所有内部对象也会被复制。似乎深度克隆的一个缺点是序列化,这种克隆对象的序列化并不容易。
但是不能说哪个更好。

于 2013-10-04T08:01:30.063 回答
1

浅拷贝:一般是克隆一个对象的方法,创建同一个类的新实例,并将所有字段复制到新实例中并返回。这不过是浅拷贝。

深度克隆

在大多数情况下,这是所需的行为。我们想要一个独立于原始版本的克隆,并且在克隆中进行更改不应影响原始版本。

您也可以考虑复制构造函数。

并提出你的问题,哪个会更好,这取决于你一直在寻找什么行为。

关于克隆的简要介绍:http: //howtodoinjava.com/2012/11/08/a-guide-to-object-cloning-in-java/

于 2013-10-04T08:09:42.877 回答
1

考虑b类是从一个类中克隆出来的。如果对一个类所做的任何更改影响了b类,那么它就是影子副本。如果对一个类所做的任何更改不影响b类,那么它被称为深度克隆。因为在影子克隆中 b 类指向 a 类..它共享相同的内存位置..在深度克隆中,将创建单独的副本..这意味着 a 类和 b 类将具有单独的内存位置..

于 2014-12-07T07:13:37.533 回答
1

这取决于您的要求,您需要一个内部指向相同对象的不同对象,或者您需要一个副本

浅克隆Object.clone()方法提供的默认克隆策略。浅克隆策略创建一个新实例并将给定对象的所有字段复制到该新实例(它是原始实例或引用)。所以在引用类型的情况下,只有引用位被复制到新实例中,因此,两个对象的引用变量将指向同一个对象。

深度克隆顾名思义,深度克隆意味着将所有内容从一个对象克隆到另一个对象。要实现这一点,您需要欺骗您的 clone() 方法提供您自己的克隆策略。您可以通过在对象层次结构中的每个引用类型中实现 Cloneable 接口并覆盖 clone() 方法,然后在对象的 clone 方法中调用 super.clone() 和这些 clone() 方法来实现。

public Person clone() throws CloneNotSupportedException {
    Person clonedObj = (Person) super.clone();
    clonedObj.city = this.city.clone();
    return clonedObj;
}

要了解更多信息,您可以通过示例详细查看 Java 克隆和克隆类型(浅层和深层)

于 2017-01-15T18:40:15.070 回答
0

这取决于您想要实现的目标:

如果您想要一个对相同对象的引用列表并且只是想以某种方式避免 ConcurrentModificationException,那么您可以使用浅克隆。

如果您想要一大堆内部具有相同值的新对象,则需要深度克隆。

于 2013-10-04T08:06:02.193 回答
0

好吧,浅克隆和深克隆都很有用。如果您有一个不包含任何其他类的引用的类实例,那么最好进行浅拷贝,但如果有一些其他类的实例被我们的具体类使用,那么我们应该选择深度克隆,否则完全克隆无法实现。

于 2015-08-14T20:20:20.160 回答