Вызов clone () для массива также клонирует его содержимое? - PullRequest
91 голосов
/ 28 апреля 2011

Если я вызову метод clone() для массива объектов типа A, как он будет клонировать свои элементы? Будет ли копия ссылаться на одни и те же объекты? Или это будет называться (element of type A).clone() для каждого из них?

Ответы [ 4 ]

76 голосов
/ 28 апреля 2011

clone() создает поверхностную копию.Это означает, что элементы не будут клонированы.(Что если они не реализовали Cloneable?)

Возможно, вы захотите использовать Arrays.copyOf(..) для копирования массивов вместо clone() (хотя клонирование подходит для массивов, в отличие от всего остального)

Если вы хотите глубокое клонирование, проверьте этот ответ


Небольшой пример, иллюстрирующий поверхностность clone(), даже если элементы Cloneable:

ArrayList[] array = new ArrayList[] {new ArrayList(), new ArrayList()};
ArrayList[] clone = array.clone();
for (int i = 0; i < clone.length; i ++) {
    System.out.println(System.identityHashCode(array[i]));
    System.out.println(System.identityHashCode(clone[i]));
    System.out.println(System.identityHashCode(array[i].clone()));
    System.out.println("-----");
}

Отпечатки:

4384790  
4384790
9634993  
-----  
1641745  
1641745  
11077203  
-----  
19 голосов
/ 21 ноября 2013

Если я вызову метод clone () для массива объектов типа A, как он будет клонировать свои элементы?

Элементы массива не будут клонированы.

Будет ли копия ссылаться на те же объекты?

Да.

Или будет вызывать (элемент типа A) .clone ()для каждого из них?

Нет, он не будет вызывать clone() ни на одном из элементов.

6 голосов
/ 10 января 2016

1D массив примитивов копирует элементы при его клонировании. Это побуждает нас клонировать 2D-массив (Array of Arrays).

Помните, что клон 2D-массива не работает из-за мелкой реализации clone().

public static void main(String[] args) {
    int row1[] = {0,1,2,3};
    int row2[] =  row1.clone();
    row2[0] = 10;
    System.out.println(row1[0] == row2[0]); // prints false

    int table1[][]={{0,1,2,3},{11,12,13,14}};
    int table2[][] = table1.clone();
    table2[0][0] = 100;
    System.out.println(table1[0][0] == table2[0][0]); //prints true
}
5 голосов
/ 28 апреля 2011

Клон является поверхностной копией массива.

Этот тестовый код печатает:

[1, 2] / [1, 2]
[100, 200] / [100, 2]

, поскольку MutableInteger совместно используется в обоих массивах как objects[0] и objects2[0], но вы можете изменить ссылку objects[1] независимо от objects2[1].

import java.util.Arrays;                                                                                                                                 

public class CloneTest {                                                                                                                                 
    static class MutableInteger {                                                                                                                        
        int value;                                                                                                                                       
        MutableInteger(int value) {                                                                                                                      
            this.value = value;                                                                                                                          
        }                                                                                                                                                
        @Override                                                                                                                                        
        public String toString() {                                                                                                                       
            return Integer.toString(value);                                                                                                              
        }                                                                                                                                                
    }                                                                                                                                                    
    public static void main(String[] args) {                                                                                                             
        MutableInteger[] objects = new MutableInteger[] {
                new MutableInteger(1), new MutableInteger(2) };                                                
        MutableInteger[] objects2 = objects.clone();                                                                                                     
        System.out.println(Arrays.toString(objects) + " / " + 
                            Arrays.toString(objects2));                                                                
        objects[0].value = 100;                                                                                                                          
        objects[1] = new MutableInteger(200);                                                                                                            
        System.out.println(Arrays.toString(objects) + " / " + 
                            Arrays.toString(objects2));                                                               
    }                                                                                                                                                    
}                                                                                                                                                        
...