web-dev-qa-db-fra.com

java Comparaison de types de données longs

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));
    }
}
33
Manu

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

62
Brian Roach

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.

3

Vous pouvez également extraire la valeur primitive de l'objet Long en utilisant:

str.longValue()
3
Mr_CRivera