2010-06-21 12 views
16

L'output del programma corrente è "Strano". Ma entrambe le variabili condividono lo stesso riferimento. Perché il secondo e il terzo confronto non sono vere?Confronto tra variabili che puntano allo stesso oggetto intero

Integer a; 
Integer b; 
a = new Integer(2); 
b = a; 
if(b == a) { 
    System.out.println("Strange"); 
} 
a++; 
if(b == a) { 
    System.out.println("Stranger"); 
} 
a--; 
if(b == a) { 
    System.out.println("Strangest"); 
} 

uscita: Strange

+0

Unboxing è probabilmente la risposta. Tuttavia, non ho una vera idea. – jjnguy

+9

+1 per dimostrare un uso imperdonabile di autoboxing. –

risposta

19

Questo è il manufatto di autoboxing e un fatto che è immutabile Integer in Java.

Gli a++ e a-- sono tradotti approssimativamente a questo.

int intA = a.getInt(); 
intA++; 
a = Integer.valueOf(intA); // this is a reference different from b 
+14

Si noti che se si sostituisce 'a = new Integer (2)' con 'a = Integer.valueOf (2)', verrà stampato anche "Strangest" poiché utilizzerà la cache intera per ottenere l'istanza. –

+0

Cosa intendi per cache intera nel tuo commento. Puoi elaborare ? – restrictedinfinity

+4

@restrictedinfinity. Almeno in Java di Sun, Byte, Short e Integer hanno una cache di 256 valori che vanno da -128 a 127 inclusi che sono serviti dal metodo 'Type.valueOf()'. Quindi nel nostro caso dopo 'a -' il valore int è '2' e sarebbe lo stesso con cui abbiamo iniziato, quindi' Integer.valueOf (2) 'avrebbe restituito lo stesso oggetto' Integer'. Nota che il tipo 'Long' non ha una cache, quindi' Long.valueOf' restituisce sempre un nuovo oggetto. –

6
  • Strage - è ovvio, le due variabili puntano allo stesso oggetto

  • non Stranger causa di autoboxing. Integer è immutabile, quindi ogni operazione su di esso crea una nuova istanza.

  • non Strangest, a causa del punto precedente e perché è stato utilizzato new Integer(..) che ignora la cache utilizzata per l'intervallo di byte. Se inizialmente si utilizza , verrà utilizzato anche il codice cache Integer e verrà stampato anche Strangest.

Problemi correlati