Maison >Java >javaDidacticiel >Pourquoi la boxe entière en Java renvoie-t-elle parfois « vrai » et parfois « faux » pour les comparaisons « == » ?
Comprendre l'étrangeté de la boxe entière en Java
En Java, les types de données primitifs comme les entiers ont des classes wrapper correspondantes, telles que Integer, pour fournir des fonctionnalités orientées objet. La façon dont ces valeurs sont encadrées et déballées peut conduire à des résultats surprenants.
Une de ces observations provient du code suivant :
public class WeirdBoxing { 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); } }
Une fois exécuté, ce code s'affiche :
false true
Pourquoi la première comparaison renvoie-t-elle faux alors que la seconde renvoie vrai ? Selon l'opérateur ==, les références doivent toujours être comparées.
Le mystère derrière la « vraie » comparaison
Fait intéressant, la vraie comparaison n'est pas un hasard. La section 5.1.7 de la spécification du langage Java (JLS) indique :
Si la valeur p encadrée est [...] un nombre entier ou court compris entre -128 et 127, [...] alors laissez r1 et r2 soit le résultat de deux conversions boxe de p. Il arrive toujours que r1 == r2.
Dans ce cas, c et d détiennent tous deux des valeurs dans la plage spécifiée, ce qui rend leurs représentations encadrées (objets entiers) identiques.
L'ambiguïté des comparaisons à plage non fixe
En revanche, la première comparaison (a == b) ne tombe pas en vertu de la règle de l’égalité garantie. Le JLS souligne ceci :
Pour les autres valeurs, [les règles] interdisent toute hypothèse sur l'identité des valeurs encadrées de la part du programmeur.
Essentiellement, lorsque des valeurs sont boxées en dehors de la plage fixe, il n'y a aucune garantie d'identité références.
Conclusion
Le comportement étrange de la boxe entière en Java découle des dispositions de la spécification du langage en matière d'efficacité et de cas d'utilisation courants. Alors que les valeurs situées dans une certaine plage sont garanties d'être encadrées de manière identique, pour d'autres valeurs, l'identité des objets encadrés est imprévisible. Cette compréhension met en lumière la « bizarrerie » illustrée par l’extrait de code présenté au début.
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!