Lorsque vous compilez un littéral numérique en Java et que vous l'assignez à un entier (majuscule I
), le compilateur émet:
Integer b2 =Integer.valueOf(127)
Cette ligne de code est également générée lorsque vous utilisez la boîte automatique.
valueOf
est implémenté de telle sorte que certains nombres soient "regroupés", et il renvoie la même instance pour les valeurs inférieures à 128.
À partir du code source java 1.6, ligne 621:
public static Integer valueOf(int i) {
if(i >= -128 && i <= IntegerCache.high)
return IntegerCache.cache[i + 128];
else
return new Integer(i);
}
La valeur de high
peut être configurée sur une autre valeur, avec la propriété système.
-Djava.lang.Integer.IntegerCache.high = 999
Si vous exécutez votre programme avec cette propriété système, il affichera true!
La conclusion évidente: ne vous fiez jamais à deux références identiques, comparez-les toujours à la .equals()
méthode.
Ainsi b2.equals(b3)
affichera vrai pour toutes les valeurs logiquement égales de b2, b3.
Notez que le Integer
cache n'est pas là pour des raisons de performances, mais plutôt pour se conformer au JLS, section 5.1.7 ; l'identité d'objet doit être donnée pour les valeurs -128 à 127 inclus.
Integer # valueOf (int) documente également ce comportement:
cette méthode est susceptible de générer des performances d'espace et de temps nettement meilleures en mettant en cache les valeurs fréquemment demandées. Cette méthode mettra toujours en cache les valeurs comprises entre -128 et 127, inclusivement, et peut mettre en cache d'autres valeurs en dehors de cette plage.