Pourquoi le code ci-dessous renvoie false for long3 == long2 compare même si c'est littéral.
public class Strings {
public static void main(String[] args) {
Long long1 = 256L + 256L;
Long long2 = 512L;
Long long3 = 512L;
System.out.println(long3 == long2);
System.out.println(long1.equals(long2));
}
}
Long
est un objet, pas une primitive. En utilisant ==
, vous comparez les valeurs de référence .
Tu as besoin de faire:
if(str.equals(str2))
Comme vous le faites dans votre deuxième comparaison.
Edit: Je comprends ... vous pensez que d’autres objets agissent comme des littéraux String
. Ils ne *. Et même dans ce cas, vous ne voudrez jamais utiliser ==
avec les littéraux String
.
(* Les types Autobox implémentent le modèle flyweight, mais uniquement pour les valeurs -128 -> 127. Si vous définissez votre Long
comme égal à 50
, vous auriez bien deux références au même objet flyweight. Et encore, ne jamais utiliser == pour les comparer.)
Modifier pour ajouter: Ceci est spécifiquement indiqué dans la spécification du langage Java, Section 5.1.7 :
Si la valeur p qui est encadrée est vraie, fausse, un octet ou un caractère compris entre\u0000 et\u007f, ou un nombre entier ou court compris entre -128 et 127 (inclus), laissez r1 et r2 les résultats de deux conversions de boxe de p. Il est toujours le cas que r1 == r2.
Notez que long
est not spécifiquement mentionné, mais les implémentations actuelles d’Oracle et OpenJDK le font (1.6 et 1.7), ce qui est une autre raison pour never utiliser ==
Long l = 5L;
Long l2 = 5L;
System.out.println(l == l2);
l = 5000L;
l2 = 5000L;
System.out.println(l == l2);
Les sorties:
vrai
faux
Si tu veux faire
str3==str2
fait comme ça..
str3.longValue()==str2.longValue()
Cela sert votre objectif et beaucoup plus rapidement, car vous comparez deux valeurs de type primitif et non des objets.
Vous pouvez également extraire la valeur primitive de l'objet Long en utilisant:
str.longValue()