L'affectation directe d'un littéral int à une référence Integer est un exemple d'auto-boxing, où la valeur littérale en code de conversion d'objet est gérée par le compilateur.
Ainsi, pendant la phase de compilation, le compilateur se convertit Integer a = 1000, b = 1000;
en Integer a = Integer.valueOf(1000), b = Integer.valueOf(1000);
.
C'est donc la Integer.valueOf()
méthode qui nous donne en fait les objets entiers, et si nous regardons le code source de la Integer.valueOf()
méthode, nous pouvons clairement voir que la méthode met en cache les objets entiers dans la plage -128 à 127 (inclus).
/**
*
* 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);
}
Ainsi, au lieu de créer et de renvoyer de nouveaux objets entiers, Integer.valueOf()
la méthode renvoie des objets Integer à partir de l'interne IntegerCache
si le littéral int passé est supérieur à -128 et inférieur à 127.
Java met en cache ces objets entiers car cette plage d'entiers est beaucoup utilisée dans la programmation quotidienne, ce qui économise indirectement de la mémoire.
Le cache est initialisé à la première utilisation lorsque la classe est chargée en mémoire à cause du bloc statique. La plage maximale du cache peut être contrôlée par l' -XX:AutoBoxCacheMax
option JVM.
Ce comportement de mise en cache n'est pas applicable uniquement aux objets Integer, similaire à Integer.IntegerCache que nous avons également ByteCache, ShortCache, LongCache, CharacterCache
pour Byte, Short, Long, Character
respectivement.
Vous pouvez en savoir plus sur mon article Java Integer Cache - Why Integer.valueOf (127) == Integer.valueOf (127) Is True .