Le compilateur unboxes la Integer
objets d' int
s pour faire de l'arithmétique avec eux en appelant intValue()
sur, et il Integer.valueOf
de zone de l' int
résultats lorsqu'ils sont affectés à l' Integer
variables, de sorte que votre exemple est équivalent à:
Integer i = Integer.valueOf(3);
i = Integer.valueOf(i.intValue() + 1);
Integer j = i;
j = Integer.valueOf(i.intValue() + j.intValue());
La cession j = i;
est tout à fait normal de référence d'objet de cession qui ne crée pas de nouveaux objets. Il n'est pas de la boxe ou l'unboxing, et n'a pas besoin de tant Integer
des objets sont immuables.
L' valueOf
méthode est autorisé à mettre en cache des objets et retourner la même instance à chaque fois pour un numéro particulier. Il est nécessaire de cache ints -128 à +127. Pour votre numéro de départ de l' i = 3
, tous les nombres sont petits et la garantie d'être mis en cache, de sorte que le nombre d'objets qui doivent être créés est de 0. Strictement parlant, valueOf
est autorisé à mettre en cache les instances paresseusement plutôt que de les avoir tous les pré-générés, afin que l'exemple peut encore créer des objets la première fois, mais si le code est exécuté à plusieurs reprises au cours d'un programme, le nombre d'objets créés à chaque fois en moyenne approches 0.
Si vous commencez avec un plus grand nombre dont les instances ne sera pas mis en cache (par exemple, i = 300
)? Ensuite, chaque valueOf
appel doit créer un nouveau Integer
de l'objet, et le nombre total d'objets créés à chaque fois est 3.
(Ou, peut-être que c'est toujours égale à zéro, ou peut-être des millions. Rappelez-vous que les compilateurs et les machines virtuelles sont autorisés à réécrire le code pour l'exécution ou la mise en œuvre des raisons, tant que son comportement n'est pas modifiée. Donc, on pourrait supprimer le code ci-dessus entièrement si vous n'avez pas utiliser le résultat. Ou si vous essayez d'imprimer j
, il pourrait réaliser qu' j
finiront toujours avec la même valeur de la constante après l'extrait ci-dessus, et de faire tous les calculs arithmétiques au moment de la compilation, et d'imprimer une valeur constante. Le montant réel du travail effectué en coulisses pour exécuter votre code est toujours un détail d'implémentation.)