java - 引用、浅复制和深复制

标签 java arrays methods deep-copy stringbuffer

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

第一个方法假设是引用方法(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();
    }
}

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

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

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();
    }

但是当我这样做时:

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;

    }

最佳答案

引用副本 = 指向原始对象的新变量。

浅复制 = 创建原始对象的新副本,并将相同的值分配给其原始属性,但对引用其他对象的属性使用与原始对象相同的引用。

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

示例:

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:这是因为这与 == 检查相同。要比较两个数组内容,您必须使用 Arrays.equals(array1, array2);

关于java - 引用、浅复制和深复制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30443349/

相关文章:

C++更改错误数组的值

Java:从数组切片中查找最大值的索引

java - 如何知道java中调用了哪些方法?

java - 使用 SimpleDateFormat 为不同的本地人格式化日期

java - 将 ElementCollection 转换为一对多关系

java - 如何将 Textviews 放入数组中并通过 findViewById 找到它们?

python - 如何选择 NumPy 数组中除索引序列之外的所有元素

java - 安排事件在 2 小时后运行

c# - 在C#中创建类时缩进时出现几个错误

python - 在另一个方法中运行一个方法。 Python