Maison > Java > javaDidacticiel > Comparaison d'entiers Java : pourquoi `==` échoue-t-il parfois et quand dois-je utiliser `.equals()` ?

Comparaison d'entiers Java : pourquoi `==` échoue-t-il parfois et quand dois-je utiliser `.equals()` ?

Barbara Streisand
Libérer: 2024-12-30 06:29:08
original
367 Les gens l'ont consulté

Java Integer Comparison: Why Does `==` Sometimes Fail, and When Should I Use `.equals()`?

Java : Énigme sur l'égalité des entiers - égal à vs. ==

Alors que les entiers et leur classe wrapper correspondante, Integer, peuvent souvent être utilisés de manière interchangeable , un comportement particulier a été rencontré lors de la comparaison de deux valeurs entières à l'aide de l'opérateur d'égalité (==).

Résultat inattendu

Considérez l'extrait de code suivant :

Integer cdiCt = ...;
Integer cdsCt = ...;
...
if (cdiCt != null && cdsCt != null && cdiCt != cdsCt)
    mismatch = true;
Copier après la connexion

Étonnamment, cette condition semblait définir de manière incorrecte la non-concordance sur vrai même lorsque les valeurs sous-jacentes de cdiCt et cdsCt étaient égales (par exemple, les deux contenant la valeur 137).

Problème d'autoboxing

Le coupable derrière ce comportement déroutant réside dans le mécanisme d'autoboxing de Java. Lors de la comparaison de primitives (par exemple, int) avec leurs classes wrapper correspondantes (par exemple, Integer), l'autoboxing convertit automatiquement la primitive en son objet wrapper. Cependant, cette conversion introduit une complication subtile.

Mise en cache JVM

Pour des raisons de performances, la JVM met en cache les valeurs entières comprises entre -128 et 127. Lors de la création d'un objet Integer dans cette plage, la JVM renvoie simplement l'instance mise en cache au lieu d'en créer une nouvelle. Ce mécanisme de mise en cache garantit que toutes les références à la même valeur primitive (dans la plage mise en cache) pointent vers la même instance Integer.

== Échec de la comparaison

Lors de la comparaison de deux Objets entiers utilisant l'opérateur d'égalité (==), Java vérifie s'ils font référence au même objet en mémoire. Si tel est le cas, la comparaison renvoie vrai ; sinon, il renvoie false. Cependant, lors de la comparaison de deux objets Integer qui se trouvent tous deux dans la plage mise en cache et contiennent la même valeur primitive, ils feront référence à la même instance mise en cache, conduisant à un faux positif dans la comparaison ==.

Solution : Utiliser la méthode égale

Pour éviter ce problème, il est recommandé d'utiliser la méthode égale lors de la comparaison d'objets entiers. La méthode equals effectue une comparaison basée sur la valeur, garantissant que deux objets Integer sont considérés comme égaux uniquement s'ils ont la même valeur primitive.

if (cdiCt != null && cdsCt != null && !cdiCt.equals(cdsCt))
    mismatch = true;
Copier après la connexion

Conclusion

While l'utilisation de == pour comparer des objets Integer dans la plage mise en cache (-128 à 127) peut sembler fonctionner, cela peut conduire à des résultats inattendus. Pour garantir des comparaisons d'égalité fiables, utilisez toujours la méthode égale à la place.

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