浅的(shallow)和类的深度副本(deep copy of a class)的区别

对象的浅层副本是一个副本,其属性与源对象的属性共享相同的引用(指向相同的基础值)。...

什么是浅薄的副本(a shallow copy)?

对象的浅层副本是一个副本,其属性与源对象的属性共享相同的引用(指向相同的基础值)。

在浅复制中,通过简单地复制原始对象的所有变量的数据来创建对象。如果在内存的堆部分中没有定义对象的任何变量,则此方法效果良好。若一些变量是从堆部分动态分配的内存,那个么复制的对象变量也将引用相同的内存位置。

这将在指针悬空时产生歧义和运行时错误。由于两个对象都将引用相同的内存位置,因此一个对象所做的更改也将在另一个对象中反映这些更改。由于我们希望创建对象的副本,因此浅拷贝不会满足此目的。

特点

  • 浅拷贝将对象的引用存储到原始内存地址。
  • 浅拷贝速度更快。
  • 浅复制反映对原始对象中的新/复制对象所做的更改。
  • 浅复制存储原始对象的副本,并指向对象的引用。
  • 浅拷贝比较便宜。

什么是深度复制(deep copy)?

对象的深度副本是一个副本,其属性与源对象的属性不共享相同的引用(指向相同的基础值)。深度拷贝用于创建新拷贝(克隆)而不引用原始数据的场景。

因此,当您更改源或副本时,可以确保不会导致其他对象也发生更改;也就是说,您不会无意中对源或副本造成您不期望的更改。该行为与浅层复制的行为形成对比,在浅层复制中,对源或副本的更改也可能导致另一个对象发生更改(因为两个对象共享相同的引用)。

通过将具有AddressInfo的Employee对象与值类型的其他成员一起视为引用类型的成员,可以通过一个示例来说明深度复制。Employee的深度副本创建了一个新对象Employee2,其值类型的成员等于Employee,但引用了一个作为AddressInfo副本的新对象AddressInfo2。

特点

  • 深度副本存储对象值的副本。
  • 深度复制相对较慢。
  • 深度复制不反映对原始对象中的新/复制对象所做的更改。
  • 深度复制存储原始对象的副本,并递归复制对象。
  • 在对象创建方面,深度复制比浅层复制昂贵,因为它涉及从其他可变对象(原始对象的一部分)递归复制数据。

浅的(shallow)和类的深度副本(deep copy of a class)的区别

比较基础浅拷贝深度复制
克隆对象克隆对象和原始对象不是100%不相交的。克隆对象和原始对象100%不相交。
变化对克隆对象所做的任何更改都将反映在原始对象中,反之亦然。对克隆对象所做的任何更改都不会反映在原始对象中,反之亦然。
创建对象克隆方法的默认版本创建对象的浅拷贝。要创建对象的深度副本,必须覆盖克隆方法。
偏爱如果对象只有基本字段,则首选浅复制。如果对象引用其他对象作为字段,则首选深度复制。
速度浅拷贝速度更快。深度复制速度慢。
方便它比较便宜。它非常昂贵。

结论

深度复制与浅层复制的不同之处在于复制对象的引用类型成员的方式。在这两种情况下复制值类型的字段成员时,将执行字段的逐位复制。复制引用类型的字段时,浅复制仅涉及复制引用,而在深复制中,执行引用对象的新复制。

  • 发表于 2022-09-10 12:48
  • 阅读 ( 69 )
  • 分类:IT

你可能感兴趣的文章

神经网络(neural network)和深度学习(deep learning)的区别

...得一个新的输入模式时,它将给出指定该输入模式所属的类的输出。强化学习接受来自环境的一些反馈。然后网络改变权重。这些是训练神经网络的方法。总的来说,神经网络有助于解决各种模式识别问题。 什么是深度学习(deep...

  • 发布于 2020-10-18 10:17
  • 阅读 ( 1192 )

班(class)和实例变量(instance variables)的区别

...一个类来创建对象。类是创建对象的蓝图。因此,对象是类的实例。在编程中,需要存储数据。数据存储在存储器中。这些内存位置称为变量。成员变量是与特定对象关联的变量。它的所有方法都是可访问的。有两种类型的成员...

  • 发布于 2020-10-19 16:54
  • 阅读 ( 299 )

班(class)和接口(interface)的区别

...老师是客体。创建对象称为实例化。OOP也使用接口。接口和类看似相似,但它们有区别。本文讨论类和接口之间的区别。类和接口之间的关键区别在于类是引用类型,它是实例化对象的蓝图,而接口是不能用于实例化对象的引用...

  • 发布于 2020-10-24 04:25
  • 阅读 ( 256 )

物体(objects)和班级(classes)的区别

对象与类 面向对象编程语言使用对象和类。C++、.NET、java等都是面向对象的编程语言,它们使用对象和类。 在编程语言中,对象被描述为一个单元,通过使用命令可以使用它。对象的示例有:变量、函数、值和数据结构。在面...

  • 发布于 2021-06-23 17:37
  • 阅读 ( 231 )

erd公司(erd)和类图(class diagram)的区别

ERD vs类图类图这个术语用于软件领域。在一种被称为“UML”或“统一建模语言”的软件语言中,有一些结构图通过显示系统的类来描述或显示任何系统的结构。这些图还显示了类的操作、属性以及不同类之间的关系。在面向对象...

  • 发布于 2021-06-23 21:07
  • 阅读 ( 323 )

如何取得出生证明副本(obtain a copy of birth certificate)

如何获得出生证明副本是一个非常重要的问题,你应该知道答案。你的出生证明是一个非常重要的文件,你必须在你的整个生命安全保管。这份文件在你人生的各个阶段都很有用,因为它是获得学校或高等教育机构录取...

  • 发布于 2021-06-27 10:30
  • 阅读 ( 286 )

身份证件(id)和css中的类(class in css)的区别

...则-定义,例2.什么是id-定义,例3.什么是类-定义,例4.id和类的区别-关键区别的比较 关键术语 类,CSS规则,ID 什么是css规则(css rules)? CSS由一组规则组成。浏览器可以解释这些规则并将其应用于文档中的指定元素。CSS样式规则...

  • 发布于 2021-06-30 21:53
  • 阅读 ( 308 )

抽象类(abstract class)和java接口(interface in java)的区别

...此外,继承是OOP的另一个支柱。它指的是使用已经存在的类的数据和方法。多重继承是指使用多个类的数据和方法。可以使用接口实现多重继承。 覆盖的关键领域 1.什么是Java中的抽象类-定义,功能2.什么是Java中的接口-定义,...

  • 发布于 2021-07-01 01:29
  • 阅读 ( 276 )

静止的(static)和最终的(final)的区别

...(final)? Final是限制用户的关键字。它可以在变量、方法和类中使用。不能更改最终变量的值。 Figure 3: Final Variable 在上述程序中,可变限速被宣布为最终限速。因此,在驱动方法中其值不能更改。因此,它显示一个错误。 Figure 4...

  • 发布于 2021-07-01 02:23
  • 阅读 ( 431 )

班(class)和结构(structure)的区别

...使用类创建对象称为实例化。 Figure 1: UML Diagram of a Class 类的成员是类的属性和方法。它们主要是三个访问说明符来支持OOP中的数据隐藏:public、private和protected。首先,公共成员对所有类都可见。其次,私有成员只在同一类中可...

  • 发布于 2021-07-01 04:30
  • 阅读 ( 291 )
xtqs156129
xtqs156129

0 篇文章

相关推荐