Maison >Java >javaDidacticiel >Pourquoi la boxe entière en Java renvoie-t-elle parfois « vrai » et parfois « faux » pour les comparaisons « == » ?

Pourquoi la boxe entière en Java renvoie-t-elle parfois « vrai » et parfois « faux » pour les comparaisons « == » ?

Barbara Streisand
Barbara Streisandoriginal
2024-12-23 00:50:14443parcourir

Why Does Integer Boxing in Java Sometimes Return `true` and Sometimes `false` for `==` Comparisons?

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn