2015-04-26 7 views
5
public class AutoBoxingAndUnBoxing 
{ 
    public static void main(String[] args) 
    { 
     Integer x = 127; 
     Integer y = 127; 
     System.out.println(x == y);//true 

     Integer a = 128; 
     Integer b = 128; 
     System.out.println(a == b);//false 
     System.out.println(a); // prints 128 
    } 
} 

Come mai x==y è vero e a==b è falso? Se si basa sul valore (Integer -128 To 127), allora 'a' dovrebbe stampare -128 giusto?Confronto di riferimento usando l'operatore ==

+2

L'intervallo di "Integer" è -2^31 a 2^31 - 1. Non è compreso tra -128 e 127; questo è l'intervallo di un 'byte'. –

risposta

2

Quando si confrontano gli oggetti Integer, l'operatore == può funzionare solo per numeri compresi tra [-128,127]. Guarda le JLS:

Se il valore p essere inscatolato è vero, falso, un byte, o un char nel gamma \ u0000 a \ u007F, o un int o numero di cortocircuito tra -128 e 127 (incluso), quindi lascia che r1 e r2 siano i risultati di due conversioni di boxing pari a di p. È sempre il caso che r1 == r2.

Dal momento che valori si sta confrontando non sono nel range citato, il risultato sarà valutata per false se non si utilizza Integer#equals.

+0

ok ma quale sarà il valore dopo 127 se l'intervallo è compreso tra -128 e 127? – kittu

+0

@ kittu cosa intendi con "il valore"? Questi valori vengono memorizzati nella cache a causa di problemi di prestazioni, i valori che sono fuori da tale intervallo devono essere confrontati usando 'equals'. – Maroun

+0

Intendo come 'a == b' è falso nel mio caso? Cosa sta succedendo internamente per renderlo falso? :/ – kittu