我一直在研究和阅读这三种(引用复制、浅复制和深复制)方法的作用以及如何创建它们;我仍然很难理解如何在我的代码中实现上述方法。
第一个方法假设是引用方法(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/