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?

Était-ce utile?

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top