首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >引用、浅拷贝和深拷贝

引用、浅拷贝和深拷贝
EN

Stack Overflow用户
提问于 2015-05-25 17:34:12
回答 1查看 3.4K关注 0票数 2

我一直在研究和阅读这三种方法(引用复制、浅拷贝和深度复制)所做的工作,以及如何创建它们;我仍然很难理解如何在代码中实现这些方法。

第一种方法是参考方法(refCopy),第二种方法应该是浅层方法(shalCopy),最后是深度复制方法(DeepCopy)。不确定这些是否正确。任何有关如何正确执行这些副本的帮助将不胜感激。

到目前为止,这是我的代码:

代码语言:javascript
运行
复制
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();
    }
}

=========================================================================

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

代码语言:javascript
运行
复制
public static StringBuffer[] shalCopy(StringBuffer[] bar){
        StringBuffer[] buf = new StringBuffer[n];
        return buf = Arrays.copyOf(bar, n);
    }

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

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

但当我这么做的时候

代码语言:javascript
运行
复制
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));

这给了我假的感觉。我以为克隆人会用它的值完全复制对象。为什么它给了我假的?

更新:

代码语言:javascript
运行
复制
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;

    }
EN

回答 1

Stack Overflow用户

发布于 2015-05-25 17:46:12

你的refCopy()很好。

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

deepCopy()需要构造一个new数组,然后复制所有输入StringBuffers

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

Update:您更新的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引用一个新数组,该数组包含与source中相同的实例。因此,更改dest[0] = null不会改变source[0],而是修改共享实例,例如dest[1].append("!")将修改source[1]
  • 深度复制 dest = deepCopy(source)应该使变量dest引用一个单独的数组,该数组包含不在source中的单独实例。因此,上述对dest的更改都不会修改source
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30443349

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档