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”?