2015-03-19 14 views
8

So che è una domanda molto semplice, ma voglio essere chiaro sul concetto. Voglio sapere come funziona l'operatore == in caso di tipo primitivo e oggetto. Per esempiocome l'operatore uguale funziona con dati di tipo primitivo e di oggetto

Integer a = 1; 
int b = 1; 
System.out.println(a == b) 

come a viene confrontato con b, mentre a contengono l'arbitro di oggetto che contiene il valore 1. Qualcuno può clearify a me come funziona internamente?

+4

Dai un'occhiata a [questa domanda] (http://stackoverflow.com/q/20877086), che è strettamente correlata. Si potrebbe anche voler leggere su [auto-unboxing] (http://docs.oracle.com/javase/tutorial/java/data/autoboxing.html), che verrà utilizzato nel codice che hai citato. –

+0

http://docs.oracle.com/javase/tutorial/java/data/autoboxing.html – ha9u63ar

+0

Possibile duplicato di [Quando si utilizza == per un valore primitivo e un valore in box, viene eseguito il boxing automatico o viene eseguito il disimballaggio] (http : //stackoverflow.com/questions/30454635/when-using-for-a-primitive-and-a-boxed-value-is-autoboxing-done-or-is-unbox) – davidwebster48

risposta

7

In generale l'operatore di uguaglianza in Java esegue un cosiddetto confronto superficiale. In altre parole, confronta i valori contenuti nelle variabili. Ora le variabili dei tipi di dati primitivi contengono il valore stesso mentre i tipi di riferimento contengono un riferimento all'area heap che memorizza il contenuto effettivo. Ciò significa che nello snippet di codice int b verrà mantenuto il valore 1 e Integer a conterrà l'indirizzo di memoria dell'oggetto Integer effettivo sull'heap.

Ora nell'esempio particolare fornito da voi c'è una particolarità. Classe intera una classe wrapper speciale che include tipi interi primitivi. Il compilatore può convertire automaticamente tra tali oggetti wrapper e tipi primitivi (che è chiamato boxing e unboxing).

Passeggiamo passo passo il codice per renderlo chiaro.

Integer a = 1; 

Il compilatore effettivamente substitue il seguente codice invece di questa linea:

Integer a = Integer.valueOf(1); 

Il metodo statico valueOf restituisce un'istanza oggetto involucro che avvolge il valore di base fornita. Questa procedura quando il compilatore costruisce una classe wrapper da un tipo primitivo è detta boxing.

Quando si utilizza un tale oggetto involucro viene confrontato con una variabile primitiva utilizzando l'operatore uguaglianza

a == b 

compilatore cambia effettivamente al seguente:

a.intValue() == b; 

dove intValue restituisce il valore di base avvolto dall'oggetto wrapper (che è chiamato unboxing), cioè cancella il valore primitivo e rende l'espressione equivalente al confronto di due primitivi. Questo è il motivo per cui l'operatore di uguaglianza ha quindi restituito true

4

Nel tuo particolare esempio di casella Integer sarà unboxed a un tipo primitivo int e == confronterà le primitive (cioè vero nel tuo caso).

+0

Significa che prima si verifichi l'unboxing automatico effettivo valore ((autounboxing) obj == val) viene confrontato in memoria non ref == val. correggimi se la mia comprensione è sbagliata. –

+0

Non so se ho capito il tuo commento ma ecco una specifica per la conversione di unboxing: http://docs.oracle.com/javase/specs/jls/se7/html/jls-5.html#jls-5.1.8 –

+0

si, il confronto di un oggetto wrapper con un tipo primitivo risulta in unboxing così da finire per confrontare due valori primitivi, vedi la mia risposta – akhilless

Problemi correlati