Jetons un coup d'œil à un morceau de code:
classe publique Main {public static void main (String [] args) {entier num1 = 100; Entier num2 = 100; Entier num3 = 200; Entier num4 = 200; '' '// Output Result' 'System.out.println (num1 == num2); System.out.println (num3 == num4); }} Devinez quel est le résultat?
Beaucoup de gens pensent que le résultat est vrai, mais le résultat n'est pas comme ça.
vrai
FAUX
Pourquoi ce résultat est-il? Si le résultat est expliqué par la mémoire, NUM1 et NUM2 pointent vers le même objet, tandis que NUM3 et NUM4 pointent vers différents objets. Ensuite, disons pourquoi, jetez un œil au code source de la valeur de la méthode de type entier:
Valeur entière statique publique (int i) {Assert IntegerCache.high> = 127; if (i> = IntegerCache.low && i <= IntegerCache.high) return IntegerCache.Cache [i + 128]; retourner un nouvel entier (i); }L'implémentation d'IntegerCache:
'' '// IntegerCache, une classe interne, noter que ses propriétés sont définies comme une classe statique privée statique finale IntegerCache {static final int high; '' '// Cache Upper Bound, temporairement null' '' Cache entier final statique []; '' '// CACHE INTEGER Array' '' '' '// Block, pourquoi est-il défini comme Block' 'STATIC {final int low = -128; '' '// cache inférieur lind, immuable. Seul la borne supérieure peut modifier '' '' '' '// La valeur élevée peut être configurée par la valeur de propriété' '' '' '' // h, qui peut être ajustée en définissant le paramètre AutoboxCacheMax de JDK (il y a une explication ci-dessous), et l'intervalle de cache automatique est défini sur [-128, n]. Notez que la limite inférieure de l'intervalle est fixe int h = 127; if (IntegerCacheHighPropValue! = null) {'' '// Utilisez long.decode ici pour éviter d'invoquer des méthodes que' '' '' '' // nécessite le cache d'autoboxing d'Integer à initialiser `` '' // en décodant IntegerCacheHighpropValue, une valeur limitée supérieure candidate est obtenue '' 'int i = Long.decode (IntegerCacheHighPropValue) .IntValue (); '' '// Prenez le plus grand comme la limite supérieure, mais elle ne peut pas être supérieure à la limite de l'entier max_value' '' i = math.max (i, 127); '' '// La taille maximale du tableau est Integer.max_value' '' h = math.min (i, Integer.max_value - -low); } high = h; '' '// La borne supérieure est déterminée' '' '' '' // Vous pouvez créer un bloc de cache, faire attention à la taille du tableau de cache '' 'cache = nouveau entier [(haut - bas) + 1]; // int j = bas; pour (int k = 0; k <cache.length; k ++) cache [k] = nouveau entier (j ++); '' '// -128 aux valeurs élevées sont allouées à un tableau de cache un par un' ''} private IntegerCache () {}}À travers ces deux pièces de code, on peut voir que lors de la création d'un objet de type entier via la méthode de valeur OF, la plage de valeur est [-128, 127]. Dans cet intervalle, le pointeur pointe vers une référence d'objet existait déjà dans IntegerCache.cache. Lorsque la valeur dépasse cette plage, un nouvel objet sera créé.
Une chose à noter est que tous les types ne sont pas dans cette gamme, regardez le double type:
classe publique Main {public static void main (String [] args) {double i1 = 100,0; Double I2 = 100,0; Double I3 = 200,0; Double I4 = 200,0; System.out.println (i1 == i2); System.out.println (i3 == i4); }}Résultat de sortie finale:
FAUX
FAUX
Pour la raison spécifique pour laquelle cela est le résultat, vous pouvez vérifier l'implémentation de la méthode double valeur de valeur dans le code source. Il est différent de la valeur entière de la méthode car le nombre de valeurs entières dans une certaine plage est limité, mais les nombres de points flottants ne le sont pas.
Notez que la mise en œuvre de la valeur des méthodes d'entier, court, octet, caractère et long est similaire.
L'implémentation de la valeur de la méthode de double et de flotteur est similaire.
Tirez un, et les résultats du type booléen ont deux vrais ou faux. Regardez directement le code source:
Valeur booléenne statique publique (booléen b) {return (b? true: false); }Les vrais et faux sont définis comme suit:
public static final booléen true = new booléen (true); '' '/ **' '' '' '' '** L'objet <code> booléen </code> correspondant à l'mitable' '' '' '* valeur <code> false </code>. '' '' '' '** /' '' '' '' '' '' * public static final boolean false = new booléen (false);
Ce qui précède est tout le contenu de cet article. J'espère que cela sera utile à l'apprentissage de tous et j'espère que tout le monde soutiendra davantage Wulin.com.