49 votes

Les entiers en cache en Java

Doublon possible :
Weird Java Boxing

Récemment, j'ai vu une présentation où il y avait l'exemple de code Java suivant :

Integer a = 1000, b = 1000;  
System.out.println(a == b); // false  
Integer c = 100, d = 100;  
System.out.println(c == d); // true

Je suis maintenant un peu confus. Je comprends pourquoi dans le premier cas le résultat est "faux" - c'est parce que Integer est un type de référence et les références de "a" et "b" sont différentes.

Mais pourquoi dans le deuxième cas le résultat est "vrai"?

J'ai entendu une opinion selon laquelle la JVM met en cache les objets pour les valeurs int de -128 à 127 à des fins d'optimisation. De cette manière, les références de "c" et "d" sont les mêmes.

Est-ce que quelqu'un peut me donner plus d'informations sur ce comportement ? Je veux comprendre les objectifs de cette optimisation. Dans quels cas les performances sont améliorées, etc. Un renvoi à une recherche sur ce problème serait formidable.

52voto

Michael Borgwardt Points 181658

Je veux comprendre les objectifs de cette optimisation. Dans quels cas la performance est-elle accrue, etc. Il serait génial de faire référence à certaines recherches sur ce problème.

Le but est principalement d'économiser de la mémoire, ce qui entraîne également un code plus rapide en raison d'une meilleure efficacité du cache.

Fondamentalement, la classe Integer garde en cache des instances Integer dans la plage de -128 à 127, et toutes les conversions automatiques, littérales et utilisations de Integer.valueOf() retourneront des instances de ce cache pour la plage qu'il couvre.

Cela repose sur l'hypothèse que ces petites valeurs surviennent beaucoup plus souvent que les autres entiers et qu'il est donc logique d'éviter les frais généraux liés au fait d'avoir des objets différents pour chaque instance (un objet Integer prend environ 12 octets).

10voto

dty Points 11383

Regardez la mise en œuvre de Integer.valueOf(int). Il renverra le même objet Integer pour des entrées inférieures à 256.

MODIFICATION :

En fait, c'est -128 à +127 par défaut comme indiqué ci-dessous.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X