Quando si utilizza == per un valore primitivo e un valore boxed, viene eseguito il boxing automatico o viene eseguito un annullamento

Il codice seguente viene compilato (con Java 8):

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

Ma che cosa fa?

Unbox i1 :

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

o casella i2 :

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

Quindi confronta due oggetti Integer (per riferimento) o due variabili int per valore?

Si noti che per alcuni numeri il confronto di riferimento produrrà il risultato corretto perché la class Integer mantiene una cache interna di valori compresa tra -128 e 127 (vedere anche il commento di TheLostMind). Questo è il motivo per cui ho usato 1000 nel mio esempio e perché specificamente chiedo informazioni sull’unboxing / boxing e non sul risultato del confronto.

È definito in JLS # 15.21.1 :

Se gli operandi di un operatore di uguaglianza sono entrambi di tipo numerico, o uno è di tipo numerico e l’altro è convertibile (§5.1.8) in tipo numerico, la promozione numerica binaria viene eseguita sugli operandi (§5.6.2).

E JLS # 5.6.2 :

Quando un operatore applica la promozione numerica binaria a una coppia di operandi, ognuno dei quali deve denotare un valore che è convertibile in un tipo numerico, si applicano le seguenti regole, nell’ordine:

  • Se qualsiasi operando è di un tipo di riferimento, è sobject alla conversione di unboxing […]

Quindi per rispondere alla tua domanda, il numero Integer è unboxed in un int .

Facciamo alcuni esempi:

Caso 1 :

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

Codice byte:

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

Caso -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 .... 

Quindi, in caso di confronto tra Integer e int con == l’ Integer è unboxed a un int e quindi il confronto avviene.

In caso di confronto di 2 Integers , vengono confrontati i riferimenti di 2 Integers .

Spiegazione

  1. Quando vengono confrontati due valori primitivi usando ==, l’autoboxing dell’operatore non ha luogo.

  2. Quando due oggetti vengono confrontati usando l’operatore ==, l’autoboxing gioca un ruolo.

  3. Quando viene utilizzata una combinazione mista, contiene un object e un tipo primitivo e il confronto viene eseguito utilizzando l’operatore == l’unboxing avviene sull’object e viene convertito in tipo primitivo.

Si prega di passare attraverso il link qui sotto che vi aiuterà a comprendere meglio il box automatico con un esempio adatto.

Refer Link: http://javarevisited.blogspot.in/2012/07/auto-boxing-and-unboxing-in-java-be.html