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?
Réponses
Trop de publicités?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
-----
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.
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));
}
}