Maison > Java > javaDidacticiel > Pourquoi l'opérateur `==` de Java compare-t-il parfois des valeurs d'objet entières et parfois des références ?

Pourquoi l'opérateur `==` de Java compare-t-il parfois des valeurs d'objet entières et parfois des références ?

Barbara Streisand
Libérer: 2024-12-24 02:28:14
original
185 Les gens l'ont consulté

Why Does Java's `==` Operator Sometimes Compare Integer Object Values and Sometimes References?

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);
    }
}
Copier après la connexion

Lors de son exécution, ce code s'imprime :

false
true
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal