Comportement surprenant de boxe entière en Java
En Java, un objet Integer est un wrapper pour une valeur int primitive. Lors du boxing d'un int dans un Integer, on s'attend généralement à ce que l'opérateur == compare les valeurs des objets. Cependant, dans certains cas, l'opérateur == compare plutôt les références des objets. Ce comportement peut conduire à des résultats surprenants.
Considérez le code suivant :
public class Scratch { public static void main(String[] args) { Integer a = 1000, b = 1000; System.out.println(a == b); Integer c = 100, d = 100; System.out.println(c == d); } }
Lors de son exécution, ce code s'imprime :
false true
La première sortie est comme prévu : == compare les références de deux objets Integer distincts. Cependant, le deuxième résultat est surprenant. Pourquoi == renvoie-t-il vrai lorsque c et d ont la même valeur ?
La réponse réside dans la spécification du langage Java (JLS). Selon la section 5.1.7 du JLS :
Si la valeur p encadrée est vraie, fausse, un octet, un caractère compris entre u0000 et u007f, ou un nombre entier ou court compris entre -128 et 127 , alors laissez r1 et r2 être les résultats de deux conversions boxe de p. Il arrive toujours que r1 == r2.
Cela signifie que les objets Integer créés à partir de valeurs primitives dans les plages spécifiées sont garantis d'avoir des références identiques. Dans notre cas, c et d sont tous deux créés à partir de la même valeur int, 100, qui se situe entre -128 et 127. Par conséquent, ils ont la même référence et l'opérateur == renvoie vrai.
Alors que le comportement de la deuxième ligne de sortie est garanti, le JLS suggère que le comportement de la première ligne de sortie ne l'est pas. En théorie, une implémentation Java pourrait mettre en cache les objets Integer pour les valeurs communes afin d'améliorer les performances, mais le JLS n'exige pas ce comportement. Par conséquent, différentes implémentations Java peuvent gérer ce cas différemment.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!