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?
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
-----
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.
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
}
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));
}
}