La Integer
classe ha una cache statica, che memorizza 256 Integer
oggetti speciali , uno per ogni valore compreso tra -128 e 127. Tenendo presente ciò, considera la differenza tra questi tre.
new Integer(123);
Questo (ovviamente) rende un Integer
oggetto nuovo di zecca .
Integer.parseInt("123");
Questo restituisce un int
valore primitivo dopo aver analizzato il String
.
Integer.valueOf("123");
Questo è più complesso degli altri. Si inizia analizzando il String
. Quindi, se il valore è compreso tra -128 e 127, restituisce l'oggetto corrispondente dalla cache statica. Se il valore è al di fuori di questo intervallo, invoca new Integer()
e passa il valore, in modo da ottenere un nuovo oggetto.
Ora, considera le tre espressioni nella domanda.
Integer.valueOf("127")==Integer.valueOf("127");
Ciò restituisce true, poiché il Integer
cui valore è 127 viene recuperato due volte dalla cache statica e confrontato con se stesso. C'è solo un Integer
oggetto coinvolto, quindi questo ritorna true
.
Integer.valueOf("128")==Integer.valueOf("128");
Ciò restituisce false
, poiché 128 non è nella cache statica. Quindi Integer
viene creato un nuovo per ogni lato dell'uguaglianza. Dal momento che ci sono due Integer
oggetti diversi , e ==
per gli oggetti ritorna solo true
se entrambi i lati sono esattamente lo stesso oggetto, lo sarà false
.
Integer.parseInt("128")==Integer.valueOf("128");
Questo sta confrontando il int
valore primitivo 128 a sinistra, con un Integer
oggetto appena creato a destra. Ma poiché non ha senso confrontare an int
con an Integer
, Java si auto-decomprimerà Integer
prima di fare il confronto; quindi si finisce per confrontare an int
con an int
. Poiché la primitiva 128 è uguale a se stessa, questo ritorna true
.
.equals()
, altrimenti tutte le scommesse sono disattivate.