【发布时间】:2015-05-25 17:34:12
【问题描述】:
我一直在研究和阅读这三种(参考拷贝、浅拷贝和深拷贝)方法的作用以及如何创建它们;而且我仍然很难理解如何在我的代码中实现上述方法。
第一个方法假设是引用方法(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;
}
【问题讨论】:
标签: java arrays methods deep-copy stringbuffer