2015-05-26 5 views
38

I seguenti compila codice (con Java 8):Quando si usa == per un primitivo e un valore in scatola, è autoboxing fatto, o è fatta unboxing

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

Ma che cosa fa?

Unbox i1:

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

o scatola i2:

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

Così ci si confronta con due Integer oggetti (di riferimento) o due int variabili per valore?

noti che per alcuni numeri il confronto riferimento produrrà il risultato corretto perché la classe Integer mantiene una cache interna di valori tra -128 per 127 (si veda 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.

+9

Sicuramente se è stato eseguito questo codice e l'output stampato è possibile determinare da soli. – Scruffy

+0

La domanda non è esattamente identica a quella utilizzata per contrassegnarla come duplicata :) – TheLostMind

+0

Controlla questa [domanda - regole di box automatico] (http://stackoverflow.com/questions/12559634/java-autoboxing-rules). Nella sua risposta, chiaramente, questo caso è stato coperto. –

risposta

38

Essa è definita nel JLS #15.21.1:

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

E JLS #5.6.2:

Quando un operatore applica promozione numerico binario ad una coppia di operandi, ciascuno dei quali deve indicare un valore che è convertibile in un tipo numerico, si applicano le seguenti regole, al fine :

  • Se qualsiasi operando è di un tipo di riferimento, è soggetto alla conversione di unboxing [...]

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

32

Consente di fare alcuni esempi:

Caso -1: codice

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

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 di Integer e int con == la Integer è unboxed a un int e quindi confronto succede.

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

-1

Spiegazione

  1. Quando due valori primitivi vengono confrontati usando == operatore autoboxing non avviene.

  2. Quando due oggetti vengono confrontati utilizzando == l'operatore di boxing automatico riproduce il ruolo .

  3. Quando si utilizza combinazione mista che è esso contiene un oggetto e tipo primitivo e confronto viene fatto utilizzando == operatore spacchettamento avviene sull'oggetto e viene convertito in tipo primitivo.

Si prega di passare attraverso il link qui sotto che vi aiuterà a capire in dettaglio su auto-boxing con l'esempio adatto.

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

Problemi correlati