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
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. –
http://docs.oracle.com/javase/tutorial/java/data/autoboxing.html – ha9u63ar
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