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;
É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;
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!