2013-08-26 17 views
22
class datatype1 
{ 

    public static void main(String args[]) 
    { 
    int i1 = 1; 
    Integer i2 = 1; 
    Integer i3 = new Integer(1); 

    System.out.println("i1 == i2"+(i1==i2)); 
    System.out.println("i1 == i3"+(i1==i3)); 
    System.out.println("i2 == i3"+(i2==i3)); 
} 

} 

uscitaint vs Integer confronto Java

i1 == i2true 
i1 == i3true 
i2 == i3false 

qualcuno può spiegare il motivo per cui ho falso quando si confrontano I2 e I3?

+1

Stai comparando puntatori, non valori ... –

+8

Riferimenti, non puntatori. – chrylis

+4

Come mai queste domande vengono svalutate ?? –

risposta

10
Integer i2 = 1; 

Il risultato è autoboxing. Stai convertendo int (tipo primitivo) nel relativo wrapper corrispondente.

Integer i3 = new Integer(1); 

Qui non c'è bisogno di autoboxing dato che si sta creando direttamente un oggetto Integer.

Ora in

i1 == i2 
i1 == i3 

I2 e I3 sono automaticamente unboxed e regolare confronto int avviene ed è per questo che si ottiene vero.

Ora consideriamo

i2 == i3 

Qui sia I2 e I3 sono oggetti numero intero che si sta confrontando. Dal momento che entrambi sono oggetti diversi (dato che hai usato un nuovo operatore), questo ovviamente darà false. Nota L'operatore == controlla se due riferimenti puntano allo stesso oggetto o meno. Infatti, il metodo .equals() se non sovrascritto fa la stessa cosa.

E 'come dire

Integer i2 = new Integer(1); 
    Integer i3 = new Integer(1); 
    System.out.println("i2 == i3 "+(i2==i3)); 

che ancora una volta darà falso.

+0

errore di copia copia la tua seconda riga di codice è la stessa di il primo –

+3

Ci scusiamo per questo, ma invece di votare giù chiunque avrebbe potuto modificarlo. –

+0

Non ero il downvoter, stavo solo dicendo che a prima vista era sbagliato. E questo era troppo piccolo per me da modificare! –