web-dev-qa-db-fra.com

Lorsque vous utilisez == pour une valeur primitive et une valeur encadrée, la mise en boîte automatique est-elle effectuée ou la décompression est-elle effectuée

Le code suivant se compile (avec Java 8):

Integer i1 = 1000;
int i2 = 1000;
boolean compared = (i1 == i2);

Mais qu'est-ce que ça fait?

Déballer i1:

boolean compared = (i1.intvalue() == i2);

ou boîte i2:

boolean compared = (i1 == new Integer(i2));

Alors, compare-t-il deux Integer objets (par référence) ou deux int variables par valeur?

Notez que pour certains nombres, la comparaison de référence donnera le résultat correct car la classe Integer conserve un cache interne de valeurs entre -128 à 127 (voir aussi le commentaire de TheLostMind). C'est pourquoi j'ai utilisé 1000 dans mon exemple et pourquoi je pose spécifiquement des questions sur le déballage/boxe et non sur le résultat de la comparaison.

53
Thirler

Il est défini dans le JLS # 15.21.1 :

Si les opérandes d'un opérateur d'égalité sont tous deux de type numérique, ou l'un est de type numérique et l'autre est convertible (§5.1.8) en type numérique, une promotion numérique binaire est effectuée sur les opérandes (§5.6.2).

Et JLS # 5.6.2 :

Lorsqu'un opérateur applique une promotion numérique binaire à une paire d'opérandes, dont chacun doit indiquer une valeur convertible en type numérique, les règles suivantes s'appliquent, dans l'ordre:

  • Si un opérande est de type référence, il est soumis à une conversion de déballage [...]

Donc, pour répondre à votre question, le Integer est déballé dans un int.

49
assylias

Faisons quelques exemples:

Cas -1:

       public static void main(String[] args) {
            Integer i1 = 1000;
            int i2 = 1000;
            boolean compared = (i1 == i2);
            System.out.println(compared);
        }

Code octet:

....
        16: if_icmpne     23 // comparing 2 integers
....

Cas -2:

public static void main(String[] args) {
    Integer i1 = 1000;
    Integer i2 = 1000;
    //int i2 = 1000;
    boolean compared = (i1 == i2);
    System.out.println(compared);
}

Bytecode:

...
     16: if_acmpne     23 // comparing references
....

Donc, en cas de comparaison de Integer et int avec == le Integer est décompressé dans un int et la comparaison se produit.

En cas de comparaison de 2 Integers, les références de 2 Integers sont comparées.

36
TheLostMind

Explication

  1. Lorsque deux valeurs primitives sont comparées à l'aide de la fonction ==, l'autoboxing de l'opérateur n'a pas lieu.

  2. Lorsque deux objets sont comparés à l'aide de l'opérateur ==, l'autoboxing joue un rôle.

  3. Lorsqu'une combinaison mixte est utilisée, c'est-à-dire qu'elle contient un objet et un type primitif et que la comparaison est effectuée à l'aide de l'opérateur ==, unboxing se produit sur l'objet et est converti en type primitif.

Veuillez suivre le lien ci-dessous qui vous aidera à comprendre en détail la boxe automatique avec un exemple approprié.

Lien de référence: http://javarevisited.blogspot.in/2012/07/auto-boxing-and-unboxing-in-Java-be.html

1
karan shah