在Java中,什么是浅拷贝?
java.util.Calendar.clone()返回“...具有相同属性的新日历”并返回“此日历的浅表副本”。
这看起来并不像在SO上回答的浅拷贝。 这个问题被标记为与语言无关, Java似乎没有遵循语言不可知的定义。 当我遍历代码时,我注意到结构和元素被复制到这个新对象,而不仅仅是语言不可知的结构。
在Java中,什么是浅拷贝?
它与Java深层副本(如果存在的话)有什么区别?
浅拷贝只复制类中引用的值。 深拷贝复制这些值。 给定:
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
浅拷贝只是一组指向相同内存位置的指针。 实际上它不会创建真正的副本,因此内存使用率较低。
在深度复制的情况下,将创建内存段的精确副本,并将指针设置为新的内存位置。 所以在这种情况下,理论上内存消耗应该是两倍。
浅拷贝是指向对象的引用指针的副本,而深拷贝是对象本身的副本。 在Java中,对象保留在后台,通常在处理对象时与之交互的是指针。 变量名称指向对象的内存空间。 当您设置一个变量等于另一个变量时,会进行浅拷贝,如下所示:
Object B = A;
可以通过获取对象A的属性并将它们放入新的对象B来进行深层复制。
Object B = new Object(A.getProperty1(), A.getProperty2()...);
这会影响程序行为,因为如果您制作浅拷贝并对其执行任务,则会影响对象的所有浅拷贝。 如果您对深层复制进行更改,则只会影响该副本。 我希望这对你来说足够详细。
链接地址: http://www.djcxy.com/p/20697.html