【问题标题】:Deep Copy vs Shallow Copy vs Reference Copy深拷贝 vs 浅拷贝 vs 参考拷贝
【发布时间】:2020-06-16 00:11:48
【问题描述】:

所以我仍然在努力理解如何创建获取不同副本并返回 em 的方法。以下是以下问题,我的尝试低于此。

编写一个方法,它将对 StringBuffer 对象数组的引用作为参数,并返回该参数数组的引用、浅拷贝和深拷贝。请注意,并非数组的每个位置都会引用 StringBuffer 对象,有些可能是 null。

public static void main(String[] args) {
    // TODO Auto-generated method stub

    //probOne();
    StringBuffer[] abc = new StringBuffer[]{new StringBuffer("Anakin"),new StringBuffer("Luke"),new StringBuffer("Ben")};
    System.out.println(abc);


    StringBuffer[] cba = refCopy(abc);
    System.out.println(cba);


    cba = shalCopy(abc);
    System.out.println(cba);

    cba = deepCopy(abc);
    System.out.println(cba);







}





public static StringBuffer[] refCopy(StringBuffer[] sa)
{       
    StringBuffer[] sb = sa;
    return sb;
}

public static StringBuffer[] shalCopy(StringBuffer[] sa)
{
    StringBuffer[] copy = new StringBuffer[sa.length];

    copy=sa;

    return copy;

}


public static StringBuffer[] deepCopy(StringBuffer[] sa)
{
    StringBuffer[] copy = new StringBuffer[sa.length];

    for (int i = 0; i < copy.length; i++) {

        copy[i] = sa[i];
    }

    return copy;
}

编辑1:我改变了深拷贝方法

    public static StringBuffer[] deepCopy(StringBuffer[] sa)
{

    StringBuffer[] copy = new StringBuffer[sa.length];

    for (int i = 0; i < copy.length; i++) {

        copy[i] = new StringBuffer(sa[i]);
    }

    return copy;



}

【问题讨论】:

  • 您的deepCopy 很浅,shalCopyrefCopy 都是参考副本。真正的深拷贝会为数组中的每一个创建一个新的 StringBuffers。
  • 现在正确吗?
  • 根据问题文本,您还应该考虑为空的条目,并将它们保留为空,而不是为它们创建新的 StringBuffer

标签: java


【解决方案1】:

假设你有这个类:

class B {
    int b;

    B(int val) { // constructor
        b = val;
    }
}

class A {
    B a;
}

参考副本

最简单的一种,基本上就是当你改变一个对象时,你就改变了另一个对象。

A orig = new A();
A copy = orig;
copy.a = new B(5); // now orig's a variable is also a B object with value 5

浅拷贝

第二个最简单的方法,它创建一个新对象,字段被复制为引用副本。

A orig = new A();
A.a = new B(5); // random value
A copy = new A();
copy.a = orig.a; // copy the b variable by reference
copy.a.b = 5; // affects orig's b variable.

深拷贝

复制所有非引用变量。

A orig = new A();
A.a = new B(5); // random value
A copy = new A();
copy.a = new B(orig.a.b); // copy the b variable not by reference
copy.a.b = 5; // doesn't affect orig's b variable.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-04-12
    • 2015-01-13
    • 2011-09-05
    • 1970-01-01
    • 1970-01-01
    • 2012-04-13
    • 2011-02-09
    • 1970-01-01
    相关资源
    最近更新 更多