在Java中,克隆和复制数组有什么区别?

6

我有这么一段代码,我需要复制一个数组。 使用System.arraycopy似乎比clone()更冗长,但两者都可以得到相同的结果。是否存在一种方法比另一种更优? 以下是代码:

import java.util.*;
public class CopyArrayandArrayList {
    public static void main(String[] args){
        //Array copying
    char[] copyFrom = { 'd', 'e', 'c', 'a', 'f', 'f', 'e'};
    char[] copyTo = new char[7];

    System.arraycopy(copyFrom, 0, copyTo, 0, 7);

    char[] copyThree = new char[7];
    copyThree=copyFrom.clone();
}
}

这篇文章与之相关,但并没有解释system.arraycopy是否进行深度克隆。它确实提到clone创建浅拷贝,并且其中的示例说明了这一点。但是对于Java初学者来说,知道system.arraycopy是否进行深度克隆并附有示例会很有用。 - eagertoLearn
System.arraycopy() 只做 Javadoc 中所说的事情,没有更多,也不进行深拷贝。 - user207421
1个回答

12

你用以下代码创建的对象:

char[] copyThree = new char[7];

将被垃圾回收。可以通过以下方式实现“最终结果”:

char[] copyThree = copyFrom.clone();

使用 System.arrayCopycopyFromcopyTo 方法需要满足一定的要求,例如数组类型和数组大小。

使用 clone 方法创建一个新的数组,并将其内容与另一个数组相同(相同对象 - 同一引用,而不是具有相同内容的不同对象)。当然,数组类型应该是相同的。

两种方式都复制数组内容的引用。它们不会 clone 对象:

Object[] array = new Object[] {
    new Object(),
    new Object(),
    new Object(),
    new Object()};
Object[] otherArray = new Object[array.length];
Object[] clonedArray = array.clone();

System.arraycopy(array, 0, otherArray, 0, array.length);

for (int ii=0; ii<array.length; ii++) {

    System.out.println(array[ii]+" : "+otherArray[ii]+" : "+clonedArray[ii]);

}

提供:

java.lang.Object@1d256a73 : java.lang.Object@1d256a73 : java.lang.Object@1d256a73
java.lang.Object@36fb2f8 : java.lang.Object@36fb2f8 : java.lang.Object@36fb2f8
java.lang.Object@1a4eb98b : java.lang.Object@1a4eb98b : java.lang.Object@1a4eb98b
java.lang.Object@2677622b : java.lang.Object@2677622b : java.lang.Object@2677622b

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接