Pourquoi la classe Integer mise en cache des valeurs dans la plage de -128 à 127?
Au sujet de ma Question précédente, Pourquoi n' == comparaisons avec Entier.valueOf(String) donner des résultats différents pour 127 et 128? , nous savons que Integer
class
a un cache qui stocke les valeurs entre -128
et 127
.
Me demandais, pourquoi entre -128 et 127?
Entier.valueOf() documentation a déclaré qu'il "cache fréquemment demandé des valeurs" . Mais n'valeurs entre -128
et 127
sont souvent demandés pour de vrai? J'ai pensé fréquemment demandés valeurs sont très subjectives.
Est-il possible que la raison derrière tout cela?
À partir de la documentation a également déclaré: "..et peut mettre en cache d'autres valeurs en dehors de cette plage."
Comment cela peut être réalisé?
Je suppose que vous boucle beaucoup plus souvent de 0 à X que de 13476 Y. Ils doivent avoir décidé que les valeurs négatives doivent également être inclus et -128 -> 127 sens pour un octet signé.
N'est-ce pas en boucle presque toujours fait w/ primitive ints -- pas en boîte Entiers? La mise en cache ne s'applique pas.
Le cache est purement une performance de chose. Tant que c'est pas de la création d'un problème de performances pour vous vous ne devriez pas vous soucier de ce que la gamme est mis en cache. (Ce serait le comble de la folie de construire dans votre code une dépendance sur l'Entier de la mise en cache.)
c'est dans le Langage Java spec, voir assylias réponse ci-dessous.
OriginalL'auteur DnR | 2014-01-03
Vous devez vous connecter pour publier un commentaire.
Me demandais, pourquoi entre -128 et 127?
Une plus grande plage d'entiers peut être mis en cache, mais au moins, ceux compris entre -128 et 127 doit être mis en cache, car il est mandaté par le Java Langage De Spécification (l'emphase est mienne):
La justification de cette exigence est expliqué dans le même paragraphe:
Comment puis-je mettre en cache d'autres valeurs en dehors de cette plage.?
Vous pouvez utiliser le
-XX:AutoBoxCacheMax
option JVM, ce qui n'est pas vraiment documenté dans la liste des disponible Hotspot Options JVM. Toutefois, il est mentionné dans les commentaires à l'intérieur duInteger
de la classe autour de la ligne 590:Noter que cette mise en œuvre est spécifique et peuvent ou peuvent ne pas être disponibles sur d'autres machines virtuelles.
merci de souligner ce point. Mon commentaire précédent n'était pas correcte. La phrase clé de la spec est "un int ... entre -128 et 127 (inclus), alors que r1 et r2 les résultats de deux de boxe conversions de p. C'est toujours le cas que r1 == r2." Donc, si je comprends bien, la spécification des mandats Entier.valueOf(X) == Integer.valueOf(X) où -128 <= X <= 127.
C'est la seule réponse au "pourquoi" de la partie de la question, qui propose autre chose que "c'est la valeur par défaut". Cependant, cette réponse n'est pas complète car elle ne traite pas le "comment" de la partie de la question. Référencement sur les réponses données par d'autres sur XX:AutoBoxCacheMax et l'ajout d'informations sur la façon de contrôler le comportement de mise en cache sur d'autres implémentations de la JVM (ou indiquant qui JVM implémentations ont des options pour contrôler ce comportement pourrait fournir une réponse complète.
"Dans la pratique, cela peut ne pas être réalisable en utilisant les techniques de mise en œuvre." Je ne peux pas obtenir cette ligne. Pouvez-vous nous l'expliquer?
L'implémentation actuelle utilise un cache qui se trouve dans la mémoire - uns "canonical" entier est tenue dans ce cache. Si la mise en cache tous les entiers signifierait que vous pourriez avoir à tenir jusqu'à 2^32 entiers (= 15+ GO) de mémoire, ce qui est déraisonnable, même sur un ordinateur de bureau.
OriginalL'auteur assylias
-128 à 127 est la taille par défaut. Mais javadoc dit aussi que la taille de l'Entier de cache peut être contrôlé par le
-XX:AutoBoxCacheMax=<size>
option. Notez qu'il ne règle que la haute valeur basse valeur est toujours -128. Cette fonctionnalité a été introduite en 1.6.Comme pour pourquoi -128 à 127 - c'est la valeur d'un octet de la gamme et il est naturel de les utiliser pour un très petit cache.
-XX:AutoBoxCacheMax=<size>
?exécuter java -XX:AutoBoxCacheMax=256 ... et vous verrez que Entier.valueOf(256) == Integer.valueOf(256)
en exécutant
java -XX:AutoBoxCacheMax=256
dans la console, j'ai euError:could not create the Java Virtual Machine
essayez la version de java, il devrait être de 1,6 ou plus, mes 1.7 fonctionne OK
À droite, c'est pourquoi javadoc dit ..peut être contrôlé... mon Java 64 bits
OriginalL'auteur Evgeniy Dorofeev
La raison de la mise en cache des petits entiers, si c'est ce que vous demandez, c'est que de nombreux algorithmes utilisent de petits entiers dans leurs calculs, afin d'éviter la création de l'objet de surcharge pour ces valeurs tend à être la peine.
La question est alors de quel entier de cache. Encore une fois, en général, la fréquence à laquelle les valeurs des constantes sont utilisées tend à diminuer à mesure que la valeur absolue de la constante augmente -- tout le monde y passe beaucoup de temps en utilisant les valeurs 1 ou 2 ou 10, relativement peu de peu de gens utilisent la valeur 109 de manière très intense, moins de devra performances dépendent de la rapidité avec laquelle on peut obtenir un nombre Entier de 722.. Java a choisi d'allouer 256 emplacements couvrant la gamme d'un octet signé valeur. Cette décision peut avoir été informé par l'analyse des programmes en vigueur à l'époque, mais il est tout aussi susceptibles d'avoir été purement arbitraire. C'est un montant raisonnable de l'espace à investir, il peut être accessible rapidement (masque pour savoir si la valeur est dans le cache de la plage, puis un rapide tableau de la recherche pour accéder à la cache), et il va certainement couvrir les cas les plus courants.
En d'autres termes, je pense que la réponse à votre question est "ce n'est pas que subjectif comme vous le pensiez, mais l'exacte des limites sont en grande partie une règle-de-pouce décision ... et experiemental preuve n'a été qu'il était assez bon."
OriginalL'auteur keshlam
Max haute valeur entière qui peut être mis en cache peut être configuré par le biais du système de la propriété que je.e
java.lang.Integer.IntegerCache.high
(-XX:AutoBoxCacheMax
) . Le cache est mis en œuvre à l'aide d'un tableau.OriginalL'auteur theexamtime
Lorsque vous rencontrez avec classe Integer et toujours encadré à l'intérieur de la plage de -128 à 127, il est toujours mieux de convertir l'Entier de l'objet en valeur int comme ci-dessous.
OriginalL'auteur Teja