2013-09-12 2 views
2

У меня есть этот бит кода, где я делаю копию массива. с использованием System.arraycopy выглядит более подробным, чем clone(). но оба дают одинаковые результаты. есть ли преимущества одного над другим? вот код:клон против копирования Array в Java?

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(); 
} 
} 
+0

эта статья связана, но не объясняет, если System.arraycopy глубокое клонирование. Он упоминает, что клон создает мелкую копию, и примеры там иллюстрируют это. но знать, является ли system.arraycopy глубоким клонированием с иллюстрацией, было бы полезно для новичков в Java. – eagertoLearn

+0

System.arraycopy() делает то, что он говорит в Javadoc, не более, без глубокой копии. – EJP

ответ

6

Объект, созданный с помощью:

char[] copyThree = new char[7]; 

будет gc'd. «Конечный результат» может быть достигнуто:

char[] copyThree = copyFrom.clone(); 

Использование System.arrayCopy, copyFrom и copyTo должны соответствовать определенным требованиям, как типы и размер массива массивов.

Используя метод 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]); 

} 

Обеспечивают:

[email protected] : [email protected] : [email protected] 
[email protected] : [email protected] : [email protected] 
[email protected] : [email protected] : [email protected] 
[email protected] : [email protected] : [email protected] 
Смежные вопросы