programmation Java (école d'ingénieur) · Chapitre 5 · Application directe du cours
Prédire l'affichage
Tableaux · niveau 2
Énoncé
Sans l'exécuter, prédire ce qu'affiche ce programme. Faire un schéma de la pile et du tas au moment où f se termine.
import java.util.Arrays;
public class PredireRef {
static void f(int[] t, int x) {
t[0] = t[0] + x;
x = x + 1;
t = new int[] {7, 7};
t[1] = x;
}
public static void main(String[] args) {
int[] a = {1, 2};
int[] b = a;
int x = 10;
f(b, x);
System.out.println(Arrays.toString(a) + " " + x);
b = new int[] {1, 2};
System.out.println((a == b) + " " + Arrays.equals(a, b));
}
}Corrigé
Le programme affiche :
[11, 2] 10
false false
À l'appel f(b, x), le paramètre t reçoit une copie de la référence de b, qui est aussi celle de a : les trois désignent le tableau {1, 2}. L'instruction t[0] = t[0] + x modifie ce tableau, qui devient {11, 2}. Ensuite, x = x + 1 modifie la copie locale de x (), pas celle de main (). Enfin, t = new int[] {7, 7} fait pointer t vers un nouveau tableau, que t[1] = x transforme en {7, 11} : ce tableau est perdu à la fin de f, aucune variable de main ne le désigne.
À la fin de f, le tas contient donc deux tableaux : {11, 2}, désigné par a et b (et par rien d'autre une fois f terminée), et {7, 11}, qui n'est plus désigné par aucune variable. Java le récupérera automatiquement : c'est le rôle du ramasse-miettes.
Dernière ligne : b désigne maintenant un nouveau tableau {1, 2} ; a == b est faux (deux tableaux distincts), et Arrays.equals(a, b) aussi, puisque a contient {11, 2}.
100 % gratuit
La suite du chapitre est sur Adloun
- 10 autres exercices corrigés dans ce chapitre
- Les 2 QCM du chapitre, le premier sans compte
- Le podcast et la vidéo du chapitre : 2 minutes d'écoute sans compte
- Le tuteur, qui guide pas à pas sans donner la réponse
Sans compte : le cours, le premier QCM et 2 minutes de podcast et de vidéo. Exercices et tuteur : inscription gratuite en 30 secondes, sans carte bancaire.