Primitives et Equivalence Boxed
-
19-09-2019 - |
Question
Alors on m'a demandé cette question aujourd'hui.
Integer a = 3;
Integer b = 2;
Integer c = 5;
Integer d = a + b;
System.out.println(c == d);
Quelle impression est ce programme sur? Il retourne vrai. Je lui ai répondu qu'il sera toujours imprimer de faux à cause de la façon dont je compris auto (et un auto) boxe. J'eu l'impression que l'attribution d'un entier = 3 va créer un nouveau Integer (3) de sorte qu'une == évaluera la référence plutôt que la valeur primitive.
Quelqu'un peut-il expliquer cela?
La solution
Valeurs Coffret entre -128 à 127 sont mises en cache. Boxe utilise la méthode de Integer.valueOf
, qui utilise le cache. Les valeurs en dehors de la plage ne sont pas mises en cache et toujours créé comme une nouvelle instance. Étant donné que vos valeurs tombent dans la plage en cache, les valeurs sont égales en utilisant == opérateur.
Citation de la spécification du langage Java:
Si la valeur p étant boxed est vrai, faux, un octet, un produit de carbonisation dans la plage \ U0000 à \ u007f ou int ou court entre -128 et 127, puis laissez r1 et r2 soient les résultats des deux conversions de boxe de p. C'est toujours le cas où r1 == r2.
http: // docs.oracle.com/javase/specs/jls/se7/html/jls-5.html#jls-5.1.7
Autres conseils
Voici ce qui se passe réellement:
Integer c = Integer.valueOf(5);
Integer d = Integer.valueOf(a.intValue() + b.intValue());
Java gère un cache d'objets Integer
entre -128 et 127. Comparer avec les éléments suivants:
Integer a = 300;
Integer b = 200;
Integer c = 500;
Integer d = a + b;
System.out.println(c == d);
Ce qui devrait imprimer false
.
Il est parce que certains des Entiers sont mises en cache, de sorte que vous comparez en fait la même référence (auto-boxed) - ce post a des exemples et des explications plus détaillées.
Mise en cache passe en dehors de autoboxing aussi, considérez ceci:
Integer a = 1;
Integer b = new Integer(1);
Integer c = Integer.valueOf(1);
System.out.println(a == b);
System.out.println(b == c);
System.out.println(c == a);
cette impression volonté:
false
false
true
Je suppose que généralement vous voulez rester loin de « == » lorsque l'on compare les objets