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
TA贡献1841条经验 获得超3个赞
浅拷贝是一组指向相同存储位置的指针。实际上,它不会创建真实副本,因此内存使用率较低。
在深度复制的情况下,将创建内存段的精确副本,并将指针设置到新的内存位置。因此,从理论上讲,在这种情况下,内存消耗应为两倍。
TA贡献1824条经验 获得超5个赞
浅表副本是指向对象的引用指针的副本,而深表副本是对象本身的副本。在Java中,对象被保留在后台,在处理对象时通常与之交互的是指针。变量名称指向对象的存储空间。当您将一个变量设置为与另一个变量相等时,将进行浅表复制:
Object B = A;
通过获取对象A的属性并将其放在新的对象B中,可以进行深层复制。
Object B = new Object(A.getProperty1(), A.getProperty2()...);
这会影响程序行为,因为如果您制作浅表副本并对其执行任务,则会影响对象的所有浅表副本。如果更改深层副本,则仅会影响该副本。希望对您足够详细。
添加回答
举报
