Quando compili un numero letterale in Java e lo assegni a un numero intero (maiuscolo I
) il compilatore emette:
Integer b2 =Integer.valueOf(127)
Questa riga di codice viene generata anche quando si utilizza il box automatico.
valueOf
è implementato in modo tale che alcuni numeri siano "raggruppati" e restituisce la stessa istanza per valori inferiori a 128.
Dal codice sorgente java 1.6, riga 621:
public static Integer valueOf(int i) {
if(i >= -128 && i <= IntegerCache.high)
return IntegerCache.cache[i + 128];
else
return new Integer(i);
}
Il valore di high
può essere configurato su un altro valore, con la proprietà di sistema.
-Djava.lang.Integer.IntegerCache.high = 999
Se esegui il tuo programma con quella proprietà di sistema, verrà generato vero!
La conclusione ovvia: non fare mai affidamento su due riferimenti identici, confrontarli sempre con il .equals()
metodo.
Quindi b2.equals(b3)
verrà stampato true per tutti i valori logicamente uguali di b2, b3.
Si noti che la Integer
cache non è presente per motivi di prestazioni, ma piuttosto per conformarsi a JLS, sezione 5.1.7 ; l'identità dell'oggetto deve essere fornita per valori compresi tra -128 e 127 inclusi.
Integer # valueOf (int) documenta anche questo comportamento:
è probabile che questo metodo produca prestazioni nello spazio e nel tempo significativamente migliori memorizzando nella cache i valori richiesti di frequente. Questo metodo memorizzerà sempre nella cache valori compresi tra -128 e 127, inclusi, e potrebbe memorizzare nella cache altri valori al di fuori di questo intervallo.