La Integerclasse ha una cache statica, che memorizza 256 Integeroggetti 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 Integeroggetto nuovo di zecca .
Integer.parseInt("123");
Questo restituisce un intvalore 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 Integercui valore è 127 viene recuperato due volte dalla cache statica e confrontato con se stesso. C'è solo un Integeroggetto coinvolto, quindi questo ritorna true.
Integer.valueOf("128")==Integer.valueOf("128");
Ciò restituisce false, poiché 128 non è nella cache statica. Quindi Integerviene creato un nuovo per ogni lato dell'uguaglianza. Dal momento che ci sono due Integeroggetti diversi , e ==per gli oggetti ritorna solo truese entrambi i lati sono esattamente lo stesso oggetto, lo sarà false.
Integer.parseInt("128")==Integer.valueOf("128");
Questo sta confrontando il intvalore primitivo 128 a sinistra, con un Integeroggetto appena creato a destra. Ma poiché non ha senso confrontare an intcon an Integer, Java si auto-decomprimerà Integerprima di fare il confronto; quindi si finisce per confrontare an intcon an int. Poiché la primitiva 128 è uguale a se stessa, questo ritorna true.
.equals(), altrimenti tutte le scommesse sono disattivate.