Вызывает ли клонирование clone() в массиве его содержимое?

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

Ответ 1

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  
-----  

Ответ 2

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

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

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

Да.

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

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

Ответ 3

1D массив примитивов копирует элементы при клонировании. Это заставляет нас клонировать 2D-массив (массив массивов).

Помните, что клон 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
}

Ответ 4

Клон - это мелкая копия массива.

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

[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));                                                               
    }                                                                                                                                                    
}