28/05/2010

Questions pièges Java n°3 : réponse

Code :

class AClass {
private static void egale(Integer i1,Integer i2){
if (i1 == i2)
System.out.println(i1 + " == " + i2);
}
public static void main(String[] args) {
egale(4,4);
egale(200,200);
}
}


Réponse
Le programme affiche donc uniquement : "4 == 4"

Explication
Lorsque l'on passe une primitive (ici un int) à une fonction qui attend explicitement le Wrapper associé (ici un Integer), la jvm "boxe" la valeur.
Ce sont donc bien des Integer (et non des int) qui sont comparés à la ligne 3, java ne réalise pas de unboxing par défaut.

La comparaison de la ligne 3 devrait donc toujours renvoyer "faux".

Cependant, java mutualise les Integer dont les valeurs sont comprises entre -128 et 127. Les références i1 et i2 pointent donc :
- sur le même Wrapper lors du premier appel,
- mais sur 2 Wrappers différent lors du second appel.

Le programme affiche donc uniquement : "4 == 4"

Point théorique associé
ici

Les commentaires sont fermés.