为了账号安全,请及时绑定邮箱和手机立即绑定

在Java中,什么是浅表副本?

在Java中,什么是浅表副本?

12345678_0001 2019-10-09 17:00:07
java.util.Calendar.clone()返回“ ...具有相同属性的新Calendar”,并返回“此Calendar的浅表副本”。为回答这并不似乎是一个浅拷贝这里的SO。该问题被标记为与语言无关, Java似乎没有遵循与语言无关的定义。在我遍历代码时,我注意到结构和元素被复制到了这个新对象,而不仅仅是语言不可知的结构。在Java中,什么是浅表副本?它与Java深层副本(如果存在)有何不同?
查看完整描述

3 回答

?
慕莱坞森

TA贡献1810条经验 获得超4个赞

浅表副本仅复制类中引用的值。深拷贝将复制值。给出:


class Foo {

  private Bar myBar;

  ...

  public Foo shallowCopy() {

    Foo newFoo = new Foo();

    newFoo.myBar = myBar;

    return newFoo;

  }


  public Foo deepCopy() {

    Foo newFoo = new Foo();

    newFoo.myBar = myBar.clone(); //or new Bar(myBar) or myBar.deepCopy or ...

    return newFoo;

  }

}


Foo myFoo = new Foo();  

Foo sFoo = myFoo.shallowCopy();  

Foo dFoo = myFoo.deepCopy();  


myFoo.myBar == sFoo.myBar => true  

myFoo.myBar.equals(sFoo.myBar) => true  

myFoo.myBar == dFoo.myBar => **false**  

myFoo.myBar.equals(dFoo.myBar) => true  

在这种情况下,浅表副本具有相同的引用(==),而深表副本仅具有等效的引用(.equals())。


如果对浅表复制的引用的值进行了更改,则该副本会反映该更改,因为它共享相同的引用。如果对深度复制的引用的值进行了更改,则该副本不会反映该更改,因为它不共享相同的引用。


C主义


int a = 10; //init

int& b = a; //shallow - copies REFERENCE

int c = a;  //deep - copies VALUE

++a;

结果:


a is 11  

*b is 11  

c is 10


查看完整回答
反对 回复 2019-10-09
?
偶然的你

TA贡献1841条经验 获得超3个赞

浅拷贝是一组指向相同存储位置的指针。实际上,它不会创建真实副本,因此内存使用率较低。


在深度复制的情况下,将创建内存段的精确副本,并将指针设置到新的内存位置。因此,从理论上讲,在这种情况下,内存消耗应为两倍。


查看完整回答
反对 回复 2019-10-09
?
沧海一幻觉

TA贡献1824条经验 获得超5个赞

浅表副本是指向对象的引用指针的副本,而深表副本是对象本身的副本。在Java中,对象被保留在后台,在处理对象时通常与之交互的是指针。变量名称指向对象的存储空间。当您将一个变量设置为与另一个变量相等时,将进行浅表复制:


Object B = A;

通过获取对象A的属性并将其放在新的对象B中,可以进行深层复制。


Object B = new Object(A.getProperty1(), A.getProperty2()...);

这会影响程序行为,因为如果您制作浅表副本并对其执行任务,则会影响对象的所有浅表副本。如果更改深层副本,则仅会影响该副本。希望对您足够详细。


查看完整回答
反对 回复 2019-10-09
  • 3 回答
  • 0 关注
  • 1127 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号