92 votes

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 appellera-t-il (element of type A).clone() pour chacun d'eux?

77voto

Bozho Points 273663

clone() crée une copie superficielle. Ce qui signifie que les éléments ne seront pas cloné. (Ce que si ils ne l'ont pas mise en œuvre d' Cloneable?)

Vous pouvez utiliser Arrays.copyOf(..) pour la copie de tableaux à la place de clone() (bien que le clonage est très bien pour les tableaux, à la différence de tout le reste).

Si vous voulez profond de clonage, de vérifier cette réponse


Un petit exemple pour illustrer le manque de profondeur de l' clone() , même si les éléments sont en 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  
-----  

19voto

Bludzee Points 565

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, il n'appellera pas clone () sur aucun des éléments.

5voto

Simon Nickerson Points 17147

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 sous forme de objects[0] et objects2[0] , mais que vous pouvez modifier 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));                                                               
    }                                                                                                                                                    
}                                                                                                                                                        
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X