Java: Integer est égale à vs ==
De Java 1.5, vous pouvez très bien l'échange Integer
avec int
dans de nombreuses situations.
Cependant, j'ai trouvé un défaut potentiel dans mon code qui m'a un peu surpris.
Le code suivant:
Integer cdiCt = ...;
Integer cdsCt = ...;
...
if (cdiCt != null && cdsCt != null && cdiCt != cdsCt)
mismatch = true;
semble être la configuration incorrecte de l'inadéquation lorsque les valeurs sont égales, bien que je ne peux pas déterminer dans quelles circonstances. J'ai mis un point d'arrêt dans Eclipse et vu que le Integer
valeurs étaient à la fois 137, et j'ai inspecté l'expression booléenne, et il a dit que c'était faux, mais quand je suis monté sur elle, c'était incohérence de vrai.
Changer le conditionnel pour:
if (cdiCt != null && cdsCt != null && !cdiCt.equals(cdsCt))
résolu le problème.
Quelqu'un peut jeter un peu de lumière sur les raisons de ce qui s'est passé? Jusqu'à présent, j'ai seulement vu le comportement sur mon localhost sur mon propre PC. Dans ce cas particulier, le code bien passé environ 20 comparaisons, mais a échoué sur 2. Le problème a toujours été reproductible.
Si c'est un problème répandu, il devrait être à l'origine des erreurs sur nos autres environnements (dev et test), mais jusqu'à présent, personne n'a signalé le problème après des centaines de tests l'exécution de ce fragment de code.
Encore s'agit-il pas légitime d'utiliser ==
pour comparer deux Integer
valeurs?
En plus de toutes les réponses ci-dessous, la suite de stackoverflow lien a un peu d'informations supplémentaires. Il fait aurait répondu à ma question d'origine, mais parce que je n'ai pas mentionné l'autoboxing dans ma question, il n'apparaît pas dans les suggestions:
Pourquoi ne peut pas le compilateur/JVM juste faire l'autoboxing “fonctionne”?
Vous devez vous connecter pour publier un commentaire.
La JVM est la mise en cache des valeurs entières. == ne fonctionne que pour les numéros compris entre -128 et 127
http://www.owasp.org/index.php/Java_gotchas#Immutable_Objects_.2F_Wrapper_Class_Caching
System.out.println(128L == 128);
imprimetrue
. Pourriez-vous donner un exemple qui ne fonctionne pas?System.out.println(new Integer(128) == new Integer(128));
Vous ne pouvez pas comparer les deux
Integer
avec un simple==
ils sont les objets de sorte que la plupart du temps, les références ne seront pas les mêmes.Il y a un truc, avec
Integer
entre -128 et 127, les références seront les mêmes que l'autoboxing utiliseInteger.valueOf()
qui met en mémoire cache les petits entiers.Ressources :
Sur le même sujet :
new Integer(1) == new Integer(1)
est encore faux.false
.==
. Si vous obtenez deux entiers en paramètres à partir de quelque part, vous n'avez aucun moyen de savoir si ils ont été créés à partir du cache ou pas.equals()
lorsque vous traitez avec des objets. Ce devrait être l'une des premières choses que l'on doit savoir lors de l'apprentissage de Java. En passant, j'aurais deviné que le constructeur deInteger
a été privé, c'est à dire que les instances ont toujours été créés par le biais de lavalueOf()
méthode. Mais je vois que le constructeur est public.valueOf
et la mise en cache a été ajouté plus tard.Le problème est que vos deux Entiers objets ne sont que des objets. Ce n'est pas parce que vous comparez vos deux références d'objet, pas de les valeurs à l'intérieur. Évidemment
.equals
est remplacé afin de fournir une comparaison de la valeur, par opposition à un objet de référence de comparaison.Integer
renvoie à la référence, qui est, lorsque l'on compare les références que vous êtes la comparaison s'ils pointent vers le même objet, pas de valeur. Par conséquent, la question que vous vous voyez. La raison pour laquelle il fonctionne tellement bien avec la plaineint
types, c'est qu'il unboxes la valeur contenue par laInteger
.Peut-je ajouter que si vous êtes en train de faire ce que vous faites, pourquoi les
if
déclaration pour commencer?"==" toujours comparer l'emplacement de la mémoire ou des références à des objets de valeurs. méthode equals de toujours comparer les valeurs. Mais équivaut aussi, indirectement, utilise le "==" opérateur de comparer les valeurs.
Entier Entier utilise le cache pour stocker les valeurs de -128 à +127. Si l'opérateur == est utilisé pour vérifier les valeurs entre -128 à 127 puis il retourne la valeur true. pour d'autres de ces valeurs, elle retourne false .
Reportez-vous à la lien pour quelques informations supplémentaires