À partir de Java 1.5, vous pouvez pratiquement échanger 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;
semblait définir incorrectement une incompatibilité lorsque les valeurs étaient égales, bien que je ne puisse pas déterminer dans quelles circonstances. J'ai défini un point d'arrêt dans Eclipse et j'ai vu que les Integer
valeurs étaient toutes les deux de 137, et j'ai inspecté l'expression booléenne et il a dit qu'elle était fausse, mais quand je l'ai enjambée, elle définissait l'incohérence sur vrai.
Changer le conditionnel en:
if (cdiCt != null && cdsCt != null && !cdiCt.equals(cdsCt))
résolu le problème.
Quelqu'un peut-il expliquer pourquoi cela s'est produit? Jusqu'à présent, je n'ai vu le comportement de mon hôte local que sur mon propre PC. Dans ce cas particulier, le code a réussi à dépasser environ 20 comparaisons, mais a échoué sur 2. Le problème était toujours reproductible.
S'il s'agit d'un problème répandu, il devrait causer des erreurs sur nos autres environnements (développement et test), mais jusqu'à présent, personne n'a signalé le problème après des centaines de tests exécutant cet extrait de code.
N'est-il toujours pas légitime d'utiliser ==
pour comparer deux Integer
valeurs?
En plus de toutes les bonnes réponses ci-dessous, le lien stackoverflow suivant contient un peu d'informations supplémentaires. Cela aurait en fait répondu à ma question initiale, mais comme je n'ai pas mentionné la mise en boîte automatique dans ma question, il n'apparaît pas dans les suggestions sélectionnées:
Pourquoi le compilateur / JVM ne peut-il pas simplement faire fonctionner l'autoboxing?
Vous ne pouvez pas comparer deux
Integer
avec un simple==
objet, donc la plupart du temps, les références ne seront pas les mêmes.Il y a une astuce, avec
Integer
entre -128 et 127, les références seront les mêmes que les utilisations de l'autoboxingInteger.valueOf()
qui met en cache les petits entiers.Ressources :
Sur le même sujet:
la source
new Integer(1) == new Integer(1)
est toujours faux.new ... == new ...
est toujoursfalse
.equals()
lorsque vous traitez avec des objets. Cela devrait être l'une des premières choses à savoir lors de l'apprentissage de Java. Au fait, j'aurais deviné que le constructeur deInteger
était privé, c'est-à-dire que les instances étaient toujours créées via lavalueOf()
méthode. Mais je vois que le constructeur est public.Le problème est que vos deux objets Integer ne sont que des objets. Ils ne correspondent pas car vous comparez vos deux références d'objet, pas les valeurs qu'elles contiennent. Il
.equals
est évidemment remplacé pour fournir une comparaison de valeur par opposition à une comparaison de référence d'objet.la source
Integer
fait référence à la référence, c'est-à-dire lorsque vous comparez des références que vous comparez si elles pointent vers le même objet, pas vers la valeur. Par conséquent, le problème que vous voyez. La raison pour laquelle cela fonctionne si bien avec plainint
types est qu'il déballe la valeur contenue par leInteger
.Puis-je ajouter que si vous faites ce que vous faites, pourquoi
if
commencer par cette déclaration?la source
"==" compare toujours l'emplacement mémoire ou les références d'objet des valeurs. La méthode equals compare toujours les valeurs. Mais equals utilise aussi indirectement l'opérateur "==" pour comparer les valeurs.
Integer utilise le cache Integer pour stocker les valeurs de -128 à +127. Si l'opérateur == est utilisé pour vérifier les valeurs comprises entre -128 et 127, il renvoie true. pour les autres valeurs, il renvoie false.
Référez-vous au lien pour quelques informations supplémentaires
la source
De plus, pour l'exactitude de l'utilisation,
==
vous pouvez simplement déballer l'une desInteger
valeurs comparées avant de faire la==
comparaison, comme:Le second sera automatiquement déballé (bien sûr, vous devez d'abord vérifier
null
s).la source
Outre ces bonnes réponses, ce que j'ai appris, c'est que:
la source