在 Java 中克隆 vs 复制数组? [复制]

Posted

技术标签:

【中文标题】在 Java 中克隆 vs 复制数组? [复制]【英文标题】:clone vs copying Array in Java? [duplicate] 【发布时间】:2013-09-17 06:58:13 【问题描述】:

我有这段代码,我正在其中制作一个数组的副本。 使用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是否是深度克隆。它确实提到克隆创建了一个浅拷贝,并且那里的示例说明了它。但是要知道 system.arraycopy 是否是带有插图的深度克隆,对 Java 初学者很有用 System.arraycopy() 按照它在 Javadoc 中所说的做,仅此而已,没有深拷贝。 【参考方案1】:

您创建的对象:

char[] copyThree = new char[7];

将被 gc'd。 “最终结果”可以通过以下方式实现:

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

【讨论】:

以上是关于在 Java 中克隆 vs 复制数组? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

克隆() vs 复制构造函数 vs 工厂方法?

在java中,如何复制一个对象?比如说string对象

Clone() vs Copy constructor-在java中推荐[重复]

如何在不使用 JSON.stringify 或 JSON.parse 的情况下在 javascript 中克隆数组? [复制]

Java:深度克隆/复制实例的推荐解决方案

克隆数组