【问题标题】:Is this a reference copy or a shallow copy?这是参考副本还是浅副本?
【发布时间】:2015-05-24 23:02:25
【问题描述】:
参考拷贝和浅拷贝有什么区别?如何填充 StringBuffer 数组?关于创建参考副本,这段代码是否正确?
import java.util.Arrays;
public class ArrayRefCopy {
public static int n = 3;
public static void main(String[] args){
StringBuffer[] hel = new StringBuffer[n];
refCopy(hel);
System.out.println(Arrays.toString(hel));
}
public static StringBuffer[] refCopy(StringBuffer[] bra){
StringBuffer[] ber = new StringBuffer[n];
return ber = bra;
}
}
【问题讨论】:
标签:
reference
copy
stringbuffer
【解决方案1】:
嗯,实际上,您的方法refCopy() 根本没有做任何事情。
当您执行它时,您将对数组hel 的引用传递给方法refCopy(),该方法将作为bra 提供。在方法内部,您创建一个新数组并将对新数组的引用分配给ber。在下一行,您再次覆盖此引用,但是使用您通过方法参数bra 收到的数组hel 的引用。
然后您返回对数组hel 的引用,但是您不使用返回的值。
因此,hel 仍然持有对与以前相同的数组的引用,并且您在 refCopy() 中创建的新数组超出范围并将被垃圾回收。
关于参考文案和浅文案的含义和定义,请自行google。应该很容易找到一个全面的定义/解释。
【解决方案2】:
这行得通吗?
import java.util.Arrays;
public class ArrayRefCopy {
public static int n = 3;
public static void main(String[] args){
StringBuffer[] hel = new StringBuffer[n];
refCopy(hel);
System.out.println(Arrays.toString(hel));
}
public static StringBuffer[] refCopy(StringBuffer[] bra){
StringBuffer[] ber = new StringBuffer[n];
return ber = Arrays.copyOf(bra, n);
}
}