在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

上一篇: In Java, what is a shallow copy?

下一篇: Arrays in Java and how they are stored in memory