J'ai eu un problème très étrange lorsque j'essaie de comparer 2 variables Long, elles montrent toujours false et je peux être sûr qu'elles ont la même valeur numérique en déboguant dans Eclipse:
if (user.getId() == admin.getId()) {
return true; // Always enter here
} else {
return false;
}
Les deux valeurs de retour ci-dessus sont de type objet Long, ce qui m'a dérouté. Et pour vérifier que j'ai écrit une méthode principale comme celle-ci:
Long id1 = 123L;
Long id2 = 123L;
System.out.println(id1 == id2);
Il s'imprime vrai.
Alors, quelqu'un peut-il me donner des idées?. Je travaille dans Java Development depuis 3 ans mais je ne peux pas expliquer ce cas.
==
Compare les références, .equals()
compare les valeurs. Ces deux Longs sont des objets, donc les références d'objets sont comparées lors de l'utilisation de l'opérateur ==
.
Cependant, notez que dans Long id1 = 123L;
La valeur littérale 123L
Sera automatiquement encadrée dans un objet Long
en utilisant Long.valueOf(String)
, et en interne, ce processus utilisera un LongCache qui a une plage [-128,127]
, Et 123 est dans cette plage, ce qui signifie que l'objet long est mis en cache, et ces deux sont en fait les mêmes objets.
car ==
compare la valeur de référence et plus petite les valeurs longues sont mises en cache
public static Long valueOf(long l) {
final int offset = 128;
if (l >= -128 && l <= 127) { // will cache
return LongCache.cache[(int)l + offset];
}
return new Long(l);
}
il fonctionne donc pour les petites valeurs longues
Voir aussi
Coincé sur un problème pendant 4 heures à cause de l'utilisation de ==
... La comparaison était correcte sur Long < 128
Mais ko sur des valeurs plus élevées.
En général, ce n'est pas une bonne idée d'utiliser ==
Pour comparer Objects
, utilisez .equals()
autant que possible! Conservez ==, >, <, <= etc.
Pour les primitives.