Combien des quatre questions de base Java pouvez-vous dire?
1. Utilisation du symbole ==
Tout d'abord, regardez un code plus intéressant
Entier a = 1000, b = 1000; Entier c = 100, d = 100; public void mrun (name de chaîne finale) {new Runnable () {public void run () {System.out.println (name); }}; } System.out.println (a == b); System.out.println (C == D); Si vous pouvez obtenir la bonne réponse à cette question et comprendre le principe. Cela signifie que vos bases sont OK. Si votre réponse est vraie et vraie, votre fondation fera défaut.
Tout d'abord, publiez la réponse, exécutez le code et nous obtiendrons un faux vrai. Nous savons que == compare les références des deux objets. L'ABCD ici est à la fois des objets nouvellement créés. En théorie, les faux devraient être entrés. C'est la chose intéressante à propos de cette question. Qu'il s'agisse de la question de l'entretien ou de la zone de discussion du forum, le taux d'apparence de cette question est très élevé. Le principe est en fait très simple. Regardons la classe Integer.Java et vous le comprendrez.
Valeur entière statique publique (int i) {return i> = 128 || I <-128? Nouveau entier (i): small_values [i + 128]; } / ** * Un cache d'instances utilisées par {@Link Integer # ValueOf (int)} et auto-boxing * / entier final statique privé [] small_values = new Integer [256]; statique {pour (int i = -128; i <128; i ++) {small_values [i + 128] = nouveau entier (i); }} Lorsque nous déclarons un entier c = 100;. À l'heure actuelle, l'opération de boxe automatique sera effectuée. Pour le dire simplement, cela signifie convertir le type de données de base en un objet entier, et le convertir en un objet entier est la valeur de la méthode appelée. Vous pouvez voir que -128-127 est mis en cache en entier. L'explication officielle est que les petits nombres sont utilisés plus fréquemment, donc pour optimiser les performances, les nombres entre eux sont mis en cache. C'est pourquoi la réponse à cette question est fausse et ture. Lorsque la valeur de l'objet entier déclaré se situe entre -128-127, le même objet est référencé, donc le résultat est vrai.
2. String
Puis regardez le code
String S1 = "ABC"; String S2 = "ABC"; String s3 = new String ("ABC"); System.out.println (S1 == S2); System.out.println (S1 == S3); Devinons quelle est la réponse à cette question?
Selon la syntaxe de ==, tout d'abord, S1, S2 et S3 sont trois objets différents. Common Sense, la sortie sera toutes fausse. Cependant, les résultats en cours d'exécution du programme sont en effet vrais et faux. La deuxième sortie false est compréhensible et la première sortie vraie est à nouveau déroutante. Nous savons que certaines variables de type de base et variables de référence de l'objet sont allouées dans la mémoire de pile de la fonction, tandis que de nouveaux objets et tableaux sont stockés dans la mémoire du tas. Cependant, en plus de cela, il y a une autre zone appelée piscine constante. Comme nous voulons généralement la chaîne s1 = "ABC";, la valeur de l'objet String déclaré est stockée dans un pool constant. Lorsque nous créons un objet comme String S1 = "ABC", "ABC" est stocké dans le pool constant (également appelé pool de chaînes). Lorsque nous créons une chaîne de référence S2 = "ABC", la couche sous-jacente Java privilégiera la recherche de savoir si "ABC" existe dans le pool constant. S'il existe, laissez S2 pointer vers cette valeur et ne le recréera pas. S'il n'y a pas de piscine constante, il sera créé et ajouté à la piscine. C'est pourquoi les réponses sont vraies et fausses.
3. Mot-clé final <br /> Regardons un morceau de code
public void mrun (nom de chaîne finale) {new Runnable () {public void run () {try {Thread.Sleep (1000); } Catch (InterruptedException e) {// TODO Block de catch généré automatiquement e.printStackTrace (); } System.out.println (nom); } }.commencer(); } Je crois que tout le monde a écrit beaucoup de ce type de code. Lorsque les classes internes accèdent aux variables locales, ils doivent ajouter un modificateur final avant les variables locales, sinon le compilateur signalera une erreur. Habituellement, nous faisons de même. Ok, la deuxième question est, pourquoi ajouter le modificateur final? Je crois que la plupart de mes amis n'ont jamais pensé à ce problème. Chaque fois qu'ils l'utilisent, ajoutez-le directement et n'ont jamais plongé dans les principes. Ce n'est pas souhaitable pour un excellent programmeur. Nous devons non seulement connaître la vérité mais aussi la raison.
Analyons maintenant pourquoi vous devez ajouter un mot-clé final. Tout d'abord, le cycle de vie de la classe interne est au niveau des membres, tandis que le cycle de vie des variables locales est dans le corps de la méthode. En d'autres termes, cette situation se produira. Lorsque la méthode MRUN est exécutée, le nouveau thread s'exécutera et le nouveau fil dormira une seconde. Le fil principal continuera d'exécuter, MRUN est exécuté et le cycle de vie de l'attribut de nom se termine. Après 1 seconde, Syetem.out.printh (nom) est exécuté. Cependant, à ce moment, le nom est mort et n'est plus en mémoire. Java doit éliminer cette erreur et nécessite strictement les variables locales dans les classes internes pour être modifiées avec des mots clés finaux. Une fois la variable locale modifiée par final, une réplique locale sera conservée en mémoire. Lorsque la classe interne accède, il est réellement accessible. C'est comme faire le cycle de vie d'une variable locale plus longtemps. Après tout, c'est l'ingénieur Java qui a rempli cette fosse pour nous à l'avance, sinon je me demande combien d'amis s'inquiéteraient des variables locales internes.
4. entier et int
Regardez le code suivant
Entier a = nouvel entier (1000); int b = 1000; Entier c = nouvel entier (10); Entier d = nouvel entier (10); System.out.println (a == b); System.out.println (C == D);
Cette question est un suivi de la première question. Si vous pouvez obtenir la réponse à cette question rapidement, félicitations, même si vous avez maîtrisé la fonction de comparaison == plus approfondie.
Révéler la bonne réponse: vrai, faux
De nombreux amis sont perplexes après avoir vu cette réponse. Parlons d'abord du second. Selon la première question, Integer n'a-t-elle pas mis en cache -128-127? Cela devrait être vrai, mais si vous regardez attentivement, l'entier ici est créé par nous, n'utilisant pas de cache, donc le résultat est faux. Voyons maintenant pourquoi le premier est à nouveau vrai? Tout d'abord, la valeur ici est 1000, ce qui n'a certainement rien à voir avec le cache entier tel que nous le connaissons. Puisqu'il n'a rien à voir avec le cache, A est l'objet du nouveau nouveau, l'entrée doit être fausse. Mais notez que B est le type int ici. Lorsque INT et INTEGER comparent ==, Java undera automatiquement entier, c'est-à-dire convertir Integer en type int, de sorte que la valeur du type int est comparée ici, donc le résultat est vrai.
Après avoir fait quelques questions correctement, dépêchez-vous et vérifiez les omissions et comblez les lacunes en fonction de votre propre niveau de test!