web-dev-qa-db-fra.com

L'appel de clone () sur un tableau permet-il également de cloner son contenu?

Si j'appelle la méthode clone() sur un tableau d'objets de type A, comment va-t-il cloner ses éléments? La copie fera-t-elle référence aux mêmes objets? Ou va-t-il appeler (element of type A).clone() pour chacun d'eux?

91
Szymon

clone() crée une copie superficielle. Ce qui signifie que les éléments ne seront pas clonés. (Et si ils n’implémentaient pas Cloneable?)

Vous voudrez peut-être utiliser Arrays.copyOf(..) pour copier des tableaux au lieu de clone() (bien que le clonage convient aux tableaux, contrairement à autre chose)

Si vous voulez un clonage profond, cochez cette réponse


Un petit exemple pour illustrer le caractère superficiel de clone() même si les éléments sont 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("-----");
}

Impressions:

4384790  
4384790
9634993  
-----  
1641745  
1641745  
11077203  
-----  
76
Bozho

Si j'appelle la méthode clone () sur un tableau d'objets de type A, comment va-t-il cloner ses éléments?

Les éléments du tableau ne seront pas clonés.

La copie fera-t-elle référence aux mêmes objets?

Oui.

Ou appellera-t-il (élément de type A) .clone () pour chacun d'eux?

Non, la fonction clone() ne sera appelée sur aucun des éléments.

19
Bludzee

Le tableau de primitives 1D copie les éléments lorsqu’il est cloné. Cela nous tente de cloner un tableau 2D (Array of Arrays).

Rappelez-vous que le clone de tableau 2D ne fonctionne pas en raison de l'implémentation de copie superficielle de 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
}
6
Thamme Gowda

Le clone est une copie superficielle du tableau.

Ce code de test imprime:

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

parce que MutableInteger est partagé dans les deux tableaux en tant que objects[0] et objects2[0], mais vous pouvez changer la référence objects[1] indépendamment de 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));                                                               
    }                                                                                                                                                    
}                                                                                                                                                        
5
Simon Nickerson