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.
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
.
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.
Explication
Lorsque deux valeurs primitives sont comparées à l'aide de la fonction ==, l'autoboxing de l'opérateur n'a pas lieu.
Lorsque deux objets sont comparés à l'aide de l'opérateur ==, l'autoboxing joue un rôle.
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