Salut,
Le souci vient de l'affectation.
Quand tu écris
1 2
| int[] tableau1 = new int[9]
int[] tableau2 = tableau1; |
Tu ne fais pas la copie des éléments du tableau1 dans le tableau2, tu affectes la valeur contenue dans la variable tableau1 à la variable2. Ici, la valeur contenue dans tableau1 est une reférence vers un tableau (une sorte d'adresse mémoire, ou une sorte d'identifiant de zone mémoire, mais interne à la JVM). Donc après tableau2=tableau1; , tableau2 contient la référence à la même zone de mémoire dans laquelle se trouve tableau1, c'est donc le même tableau référencé par 2 variables. Donc si tu écris :
1 2
| tableau2[2]=1;
System.out.println(tableau1[2]); |
ça t'affiche 1, parce que c'est la même chose, juste représenté par 2 variables différentes.
C'est exactement la même chose si tu écris :
1 2 3 4 5 6 7 8 9 10 11
| int[] tab1 = new int[9];
List<int[]> list = new ArrayList<>();
for(int i=0; i<10; i++) {
int[] tab2 = tab1;
list.add(tab2);
}
tab1[1] = 1;
for(int[] tab : list) {
for(int i : tab) System.out.print(i);
System.out.println();
} |
ça affiche :
010000000
010000000
010000000
010000000
010000000
010000000
010000000
010000000
010000000
010000000
Dans la liste, tu as simplement 10 fois le même tableau.
- Pour copier un tableau dans un autre :
1 2 3 4 5 6 7 8 9 10 11 12
| public static void copyTo(int[] tab1, int[] tab2) {
System.arraycopy(tab1, 0, tab2, 0, Math.min(tab1.length, tab2.length));
}
public static int[] createCopy(int[] tab1) {
int[] tab2 = new int[tab1.length];
System.arraycopy(tab1, 0, tab2, 0, tab1.length);
return tab2;
}
public static int[] createCopy2(int[] tab1) {
return Arrays.copyOf(tab1, tab1.length);
} |
[*]pour remplir un tableau, par exemple de 0 :
A noter que à la création, un tableau de int contient des 0.
est équivalent à
int[] tab={0,0,0,0,0,0,0,0,0};
est équivalent à
int[] tab=new int[]{0,0,0,0,0,0,0,0,0};
La première écriture restant la plus courte et la plus simple.[/LIST]
Au passage, quand tu écris :
1 2
| int[] temp = new int[9];
temp = plateau; |
Tu crées un tableau de 9 cases, qui ensuite est perdu, puisque temp contient la référence contenue dans plateau. Tu crées donc un tableau pour rien. Ce n'est pas très grave dans ton cas, il va juste occuper de la mémoire jusqu'à ce que le GarbageCollector décide de le virer parce qu'il a besoin de place pour un autre objet. Mais dans une application réelle, où des centaines de milliers d'objets peuvent être créé, en créer pour rien peut être couteux : lorsqu'il y aura besoin de mémoire pour des objets, le Garbage Collector va prendre beaucoup de temps pour nettoyer la mémoire de tout un tas d'objets qui n'auront jamais servi à rien, puisque jamais utilisés.
Si ce n'est une copie, int[] temp = plateau; suffit, et pour une copie int[] temp = Arrays.copy(plateau,plateau.length);.
Dernière remarque : à moins d'avoir besoin d'un "affichage" particulier, System.out.println(Arrays.toString(tab)); est un moyen simple d'afficher le tableau tab en console.
Partager