Explications sélectionnées des bases de Java, voyez combien de réponses vous pouvez obtenir ?
Le manque de profondeur technique est la norme pour la plupart des programmeurs.
Comparaison d'entiers
Regardez le code intéressant ci-dessous Avez-vous remarqué des anomalies si vous êtes sensible aux nombres ?
public static void main(String[] args) { Integer a = 128,b=128; Integer c = 127,d=127; System.out.println(a==b); System.out.println(c==d); }
Si votre réponse est fausse, fausse, peut-être avez-vous une certaine base et savez-vous qu'Integer est une classe encapsulée. Bien sûr, si votre réponse est vraie, alors elle se situe dans un certain domaine de connaissances, mais les connaissances de base ne sont pas suffisantes.
D'accord, exécutons la méthode principale. La bonne réponse doit être fausse ou vraie. Cette question est apparue dans de nombreuses questions d'entretien au cours des dernières années. Bien sûr, vous direz aussi : je peux faire des projets et tout ira bien, j'ai juste besoin de le vérifier. Pourquoi ai-je besoin de savoir que je n'ai rien à dire ?
En fait, lorsque nous attribuons une valeur int à un objet Integer, la méthode statique valueOf de la classe Integer sera appelée. Voyons comment le code source est implémenté.
La méthode IntegerCache a des commentaires clairs, la portée du cache, comment la modifier, etc.
/** * Cache to support the object identity semantics of autoboxing for values between * -128 and 127 (inclusive) as required by JLS. * * The cache is initialized on first usage. The size of the cache * may be controlled by the -XX:AutoBoxCacheMax=<size> option. * During VM initialization, java.lang.Integer.IntegerCache.high property * may be set and saved in the private system properties in the * sun.misc.VM class. */ private static class IntegerCache { static final int low = -128; static final int high; static final Integer cache[]; static { // high value may be configured by property int h = 127; String integerCacheHighPropValue = sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high"); if (integerCacheHighPropValue != null) { int i = parseInt(integerCacheHighPropValue); i = Math.max(i, 127); // Maximum array size is Integer.MAX_VALUE h = Math.min(i, Integer.MAX_VALUE - (-low) -1); } high = h; cache = new Integer[(high - low) + 1]; int j = low; for(int k = 0; k < cache.length; k++) cache[k] = new Integer(j++); } private IntegerCache() {} }
public static Integer valueOf(int i) { assert IntegerCache.high >= 127; if (i >= IntegerCache.low && i <= IntegerCache.high) return IntegerCache.cache[i + (-IntegerCache.low)]; return new Integer(i); }
La magie n'est pas magique En fait, la description du code est très claire. le littéral entier est compris entre -128 et 127, un nouvel objet Integer ne sera pas créé, mais l'objet Integer dans le pool constant sera directement référencé, donc le résultat de l'opération ci-dessus est a==b=false et c==d = vrai.
Comparaison de chaînes
La question suivante devrait être relativement simple.
public static void main(String[] args) { String s1 = "abc"; String s2 = "abc"; String s3 = new String("abc"); System.out.println(s1 == s2); System.out.println(s1 == s3); }
Est-ce que cela vous semble familier, les gars ? Certaines personnes peuvent être capables de déterminer d’un seul coup d’œil si la réponse est vraie ou fausse. Bien sûr, ne vous découragez pas si vous n’obtenez pas la bonne réponse. Analysons pourquoi Mao a une telle réponse.
Selon la syntaxe de ==, tout d'abord, s1, s2 et s3 sont trois objets différents. De manière générale, le résultat sera faux. Cependant, le résultat de l'exécution du programme est bien vrai ou faux. La deuxième sortie de false est compréhensible, mais la première sortie de true est déroutante.
Nous savons que certains types de base de variables et de variables de référence d'objet sont alloués dans la mémoire de pile de la fonction, tandis que la mémoire tas stocke de nouveaux objets et tableaux. Cependant, en plus de cela, il existe une zone appelée pool constant.
Comme on pense habituellement à String s1 = "abc" ; la valeur de l'objet chaîne déclaré de cette manière est stockée dans le pool de constantes. Lorsque nous créons un objet comme String s1 = "abc", "abc" est stocké dans le pool de constantes (également appelé pool de chaînes).
Lorsque nous créons une référence à String s2 = "abc", la couche inférieure Java recherchera d'abord si "abc" existe dans le pool de constantes. S'il existe, laissez s2 pointer vers cette valeur et ne la recréera pas. Si la constante Si le pool n'existe pas, créez-la et ajoutez-la au pool. C'est pourquoi les réponses sont vraies et fausses.
Comparaison entre Integer et int
public static void main(String[] args) { Integer a = new Integer(128); int b = 128; Integer c = new Integer(6); Integer d = new Integer(6); System.out.println(a == b); System.out.println(c == d); }
Je crois que beaucoup d'amis sont confus, n'est-ce pas ? Annonçons directement la réponse, vraie ou fausse.
c == d=false, je ne pense pas qu'il y ait grand chose à dire. Certains amis peuvent demander, n'est-ce pas -128-127 en cache ? Mais l'entier que nous avons ici est nouveau et non mis en cache, donc le résultat est faux.
a == b=true. Veuillez noter que b ici est de type int Lorsque int et Integer sont comparés ==, le type Integer sera automatiquement déballé, c'est-à-dire que l'Integer sera converti en Integer. type int. Donc, ce qui est comparé ici est la valeur du type int, donc le résultat est vrai.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!