Java 参考、浅拷贝和深拷贝

Java 参考、浅拷贝和深拷贝,java,arrays,methods,deep-copy,stringbuffer,Java,Arrays,Methods,Deep Copy,Stringbuffer,我一直在研究和阅读这三种方法(参考拷贝、浅拷贝和深拷贝)的作用以及如何创建它们;我仍然很难理解如何在代码中实现上述方法 假设第一种方法是参考方法(refCopy),第二种方法是浅层方法(shalCopy),最后一种方法是深层方法(deepCopy)。不确定这些是否正确。对于如何正确执行这些副本的任何帮助,我们将不胜感激 这是我目前的代码: public class ArrayRefCopy implements Cloneable { private static int n = 3;

我一直在研究和阅读这三种方法(参考拷贝、浅拷贝和深拷贝)的作用以及如何创建它们;我仍然很难理解如何在代码中实现上述方法

假设第一种方法是参考方法(refCopy),第二种方法是浅层方法(shalCopy),最后一种方法是深层方法(deepCopy)。不确定这些是否正确。对于如何正确执行这些副本的任何帮助,我们将不胜感激

这是我目前的代码:

public class ArrayRefCopy implements Cloneable {
    private static int n = 3;
    private static StringBuffer[] buf = new StringBuffer[4];
    public static void main(String[] args){

        StringBuffer[] hel = new StringBuffer[n];
        hel[0] = new StringBuffer("hello");
        hel[1] = new StringBuffer("hallo");
        hel[2] = new StringBuffer("hey");

        refCopy(hel);
        System.out.println(Arrays.toString(hel));
        shalCopy(hel);
        System.out.println(Arrays.toString(hel));


    }

    public static StringBuffer[] refCopy(StringBuffer[] bra){

        StringBuffer[] ber = bra;
        return ber;
    }

    public static StringBuffer[] shalCopy(StringBuffer[] bar){

        return buf = bar;
    }

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

        StringBuffer[] deep = new StringBuffer[n];
        return deep = bri.clone();
    }
}
=========================================================================

我将最后两个方法更改为(在其中创建对象):

但当我这么做的时候:

StringBuffer[] hel = new StringBuffer[n];
        hel[0] = new StringBuffer("hello");
        hel[1] = new StringBuffer("hallo");
        hel[2] = new StringBuffer("hey");

        StringBuffer[] hal = new StringBuffer[n];
        hal = deepCopy(hel);


        System.out.println(hal.equals(hel));
它给我错误的印象。我以为克隆会完全复制对象及其值。为什么它给我假消息

更新:

public static StringBuffer[] shalCopy(StringBuffer[] bar){
        StringBuffer[] buf = new StringBuffer[bar.length];
        for(int i = 0; i < bar.length; i++){
            buf[i] = bar[i];
        }

            return buf;
        }




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

        StringBuffer[] deep = new StringBuffer[bri.length];
        for(int i=0; i < bri.length; i++){
            bri[i] = new StringBuffer(bri[i]);
            deep[i] = bri[i];
        }

        return deep;

    }
publicstaticstringbuffer[]shalCopy(StringBuffer[]bar){
StringBuffer[]buf=新StringBuffer[bar.length];
对于(int i=0;i
Reference copy=指向原始对象的新变量

浅复制=创建原始对象的新副本,并为其基本体特性指定相同的值,但对引用其他对象的特性使用与原始对象相同的引用

深度复制=创建原始对象的新副本,并递归地为原始对象引用链中的每个对象引用创建新副本

例如:

class C {
int b;
A ref1; // in shallow copy, use the same object reference. In deep copy, create a copy on this class instance
}

要回答关于为什么
hal.equals(hel)
返回false的第二个问题,因为这与==check相同。要比较两个数组的内容,必须使用
arrays.equals(array1,array2)

您的
refCopy()
很好

shalCopy()
需要构造一个
new
数组,然后在输入
StringBuffer
引用中进行复制,以便共享这些
StringBuffer
对象。编写循环或使用
arrayCopy

deepCopy()

你能填一下细节吗?如果我们为你做作业,你可能也不会从中学到什么

更新:在这种情况下,您更新的
shalCopy()
方法得到正确的结果,但是(1)它应该使用
bar.length
(其输入数组长度),而不是假设其输入数组具有长度
n
,以及(2)第一个赋值
buf=new StringBuffer[n]
是毫无意义和误导性的,因为代码会立即用另一个数组替换它。另外,如果您编写一个显式循环而不是调用
Arrays.copyOf()
,这将更有指导意义

您更新的
deepCopy()
没有得到正确的结果,并且重复了上述问题
clone()
不是我们需要的,一般来说没有多大用处,也没有阐明手头的问题,也就是说,它在这里没有指导意义。相反,尝试构造一个新数组并使用循环(深度)复制所有StringBuffer对象,而不是它们的引用

下面是如何判断代码是否有效的方法:

  • 引用副本
    dest=refCopy(source)
    应使变量
    dest
    引用与
    source
    相同的实例。因此,更改例如
    dest[0]=null也将更改
    source[0]
  • 浅拷贝
    dest=shalCopy(source)
    应使变量
    dest
    引用一个新数组,该数组包含与
    中相同的实例。因此,更改
    dest[0]=null
    不会更改
    source[0]
    ,但是修改共享实例,例如
    dest[1]。append(!”
    将修改
    source[1]
  • deep copy
    dest=deepCopy(source)
    应使变量
    dest
    引用一个单独的数组,该数组包含不在
    source
    中的单独实例。因此,上述对
    dest
    的更改都不会修改
    源代码

  • 是的,我知道。我想这就是我需要的全部信息。我开始明白了。非常感谢。我可能会在稍后发布我的新代码,以确保我理解这些术语。对于如何为此编写循环,我有点困惑。我得出的结论是:对于(inti=0;IStringBuffer[]output=new StringBuffer[input.length]
我使用了更有意义的变量名。这意味着将方法arg name更改为
input
。在
shalCopy()
循环中,复制每个数组元素引用:
output[I]=input[I]
。不要在那里声明另一个数组变量。在
deepCopy()中
循环类似,但复制了
StringBuffer
实例。这比我想象的要复杂得多。这个循环有什么问题,为什么不起作用?公共静态StringBuffer[]shalCopy(StringBuffer[]bar){StringBuffer[]buf=new StringBuffer[bar.length];for(int I:bar){buf[I]=bar[I];return buf;}Arrays.equals对这三个值是真的吗
class C {
int b;
A ref1; // in shallow copy, use the same object reference. In deep copy, create a copy on this class instance
}