web-dev-qa-db-fra.com

Quelles sont les 2 variables longues égales à l'opérateur == à comparer en Java?

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.

20
Brady Zhu

== 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.

33
BlackJoker

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

8
Jigar Joshi

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.

1
Thibault