L'assegnazione diretta di un valore letterale int a un riferimento intero è un esempio di boxing automatico, in cui il valore letterale del codice di conversione dell'oggetto viene gestito dal compilatore.
Quindi durante la fase di compilazione il compilatore converte Integer a = 1000, b = 1000;
in Integer a = Integer.valueOf(1000), b = Integer.valueOf(1000);
.
Quindi è il Integer.valueOf()
metodo che effettivamente ci fornisce gli oggetti interi, e se guardiamo il codice sorgente del Integer.valueOf()
metodo possiamo vedere chiaramente che il metodo memorizza nella cache gli oggetti interi nell'intervallo da -128 a 127 (inclusi).
/**
*
* This method will always cache values in the range -128 to 127,
* inclusive, and may cache other values outside of this range.
*
* @param i an {@code int} value.
* @return an {@code Integer} instance representing {@code i}.
* @since 1.5
*/
public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
Quindi, invece di creare e restituire nuovi oggetti interi, Integer.valueOf()
il metodo restituisce oggetti Integer dall'interno IntegerCache
se il valore letterale int passato è maggiore di -128 e minore di 127.
Java memorizza nella cache questi oggetti interi perché questo intervallo di numeri interi viene utilizzato molto nella programmazione quotidiana che risparmia indirettamente un po 'di memoria.
La cache viene inizializzata al primo utilizzo quando la classe viene caricata in memoria a causa del blocco statico. L'intervallo massimo della cache può essere controllato -XX:AutoBoxCacheMax
dall'opzione JVM.
Questo comportamento di memorizzazione nella cache non è applicabile solo agli oggetti Integer, simile a Integer.IntegerCache che abbiamo anche ByteCache, ShortCache, LongCache, CharacterCache
per Byte, Short, Long, Character
rispettivamente.
Puoi leggere di più nel mio articolo Java Integer Cache - Why Integer.valueOf (127) == Integer.valueOf (127) Is True .