Voyons d'abord un résultat de test:
/ * public static void main (String [] args) {entier a = 128, b = 128; Entier c = 127, d = 127; System.out.println (a == b); // false System.out.println (c == d); // true} * / / * public static void main (String [] args) {Integer int1 = Integer.Valueof ("100"); Integer int2 = Integer.ValueOf ("100"); System.out.println (int1 == int2); // true} * / public static void main (String [] args) {Integer int1 = Integer.valueof ("300"); Integer int2 = Integer.ValueOf ("300"); System.out.println (int1 == int2); // false}Le code source de JDK est le suivant:
Valeur entière statique publique (String S) lève NumberFormatexception {return Integer.ValueOf (ParseInt (S, 10)); } public static entier statique (int i) {if (i> = IntegerCache.low && i <= IntegerCache.high) return IntegerCache.cache [i + (-IntegerCache.low)]; retourner un nouvel entier (i); }J'ai trouvé qu'il y avait un autre mystère à l'intérieur, et il y avait une classe IntegerCache:
classe statique privée IntegerCache {static final int low = -128; statique final int high; Cache entier final statique []; statique {// La valeur élevée peut être configurée par la propriété int h = 127; String IntegerCacheHighPropValue = Sun.Misc.vm.GetsAvedProperty ("Java.lang.integer.integerCache.high"); if (IntegerCacheHighPropValue! = null) {try {int i = paSeInt (IntegerCacheHighPropValue); i = math.max (i, 127); // La taille maximale du tableau est Integer.max_value h = math.min (i, Integer.max_value - (-low) -1); } catch (NumberFormatexception nfe) {// Si la propriété ne peut pas être analysée dans un int, ignorez-la. }} high = h; cache = nouvel entier [(élevé - bas) + 1]; int j = bas; pour (int k = 0; k <cache.length; k ++) cache [k] = nouveau entier (j ++); // La plage [-128, 127] doit être internalisée (JLS7 5.1.7) ASSERT IntegerCache.high> = 127; } private IntegerCache () {}}Il s'avère que l'entier instancie tous les entiers de -128 à 127 (réglable).
Cela explique la réponse. Il s'avère que, peu importe le nombre d'entiers que vous créez dans cette plage, ils utilisent tous une valeur de la même valeur pour produire le même objet.
Mais pourquoi JDK doit-il faire tant de choses de cette manière? Réfléchissons attentivement. La plupart des produits de Taobao sont au prix de moins de 100 yuans. Combien d'entiers seront utilisés dans le serveur backend en une journée? En utilisant IntegerCache, cela réduit le temps pour obtenir de nouvelles et améliore l'efficacité. Dans le même temps, JDK fournit également du cache de grande valeur configurable.
Cela améliore sans aucun doute la flexibilité et facilite l'optimisation de JVM.
Résumer
Ce qui précède est tout le contenu de cet article sur la lecture du code source Integer IntegerCache, j'espère que cela sera utile à tout le monde. Les amis intéressés peuvent continuer à se référer à d'autres sujets connexes sur ce site. S'il y a des lacunes, veuillez laisser un message pour le signaler. Merci vos amis pour votre soutien pour ce site!