Maison  >  Article  >  Java  >  Explication détaillée de intern() dans l'objet String

Explication détaillée de intern() dans l'objet String

Y2J
Y2Joriginal
2017-05-19 09:45:261594parcourir

1. Tout d'abord, String n'appartient pas aux 8 types de données de base.
Étant donné que la valeur par défaut d'un objet est nulle, la valeur par défaut de String est également nulle, mais il s'agit d'un objet spécial et possède certaines caractéristiques que d'autres objets n'ont pas.

2. new String() et new String("") déclarent tous deux une nouvelle chaîne vide, qui est une chaîne vide et non nulle

3. La différence entre
String str=new String (« kvill »); :

Ici, on ne parle pas du tas ou de la pile, on introduit simplement la constante piscine premier concept.

Le pool constant fait référence à certaines données déterminées lors de la compilation et enregistrées dans le fichier .class compilé. Il comprend des constantes dans les classes, méthodes, interfaces, etc., ainsi que des constantes de chaîne.

Regardez l'exemple 1 :

String s0=”kvill”; 
String s1=”kvill”; 
String s2=”kv” + “ill”; 
System.out.
print
ln( s0==s1 ); 
System.out.println( s0==s2 );

Le résultat est :

true 
true

Tout d'abord, nous devons savoir que Java assurez-vous qu'une constante de chaîne n'a qu'une copie.

Parce que les "kvill" dans s0 et s1 dans l'exemple sont tous deux des constantes de chaîne, ils sont déterminés au moment de la compilation, donc s0==s1 est vrai et "kv" et "ill" le sont également ; toutes les constantes de chaîne. Lorsqu'une chaîne est concaténée par plusieurs constantes de chaîne, elle doit elle-même être une constante de chaîne, donc s2 est également analysée en une constante de chaîne au moment de la compilation, donc s2 est également un pool de constantes. > de "kvill". Nous concluons donc que s0==s1==s2; La chaîne créée avec new String() n'est pas une constante et ne peut pas être déterminée au moment de la compilation, donc la chaîne créée avec new String() ne contient pas constantes Dans le pool, elles ont leur propre espace d'adressage.

Regardez l'exemple 2 :



Le résultat est :
String s0=”kvill”; 
String s1=new String(”kvill”); 
String s2=”kv” + new String(“ill”); 
System.out.println( s0==s1 ); 
System.out.println( s0==s2 ); 
System.out.println( s1==s2 );


Dans l'exemple 2, s0 est toujours dans l'application du pool constant "kvill" ", s1 ne peut pas être déterminé au moment de la compilation, il s'agit donc d'une référence au nouvel objet "kvill" créé au moment de l'exécution, et s2 ne peut pas être déterminé au moment de la compilation car il a la seconde moitié de la nouvelle chaîne ("ill"), c'est donc aussi une nouvelle application
false 
false 
false
Créer un objet

de "kvill" ; si vous les comprenez, vous saurez pourquoi ce résultat est obtenu. 4. String.intern() :

Encore un point : le pool de constantes qui existe dans le fichier .class est chargé par la JVM pendant l'exécution et peut être étendu. La méthode intern() de String est une méthode pour étendre le pool de constantes ; lorsqu'une instance String str appelle la méthode intern(), Java recherche s'il existe une constante de chaîne avec le même Unicode dans le pool de constantes, et si c'est le cas, renvoie sa référence. Si ce n'est pas le cas, ajoutez une chaîne Unicode égale à str dans le pool de constantes et renvoyez sa référence, cela sera clair en regardant l'exemple 3

Exemple 3 :


Le résultat est :

String s0= “kvill”; 
String s1=new String(”kvill”); 
String s2=new String(“kvill”); 
System.out.println( s0==s1 ); 
System.out.println( “**********” ); 
s1.intern(); 
s2=s2.intern(); //把常量池中“kvill”的引用赋给s2 
System.out.println( s0==s1); 
System.out.println( s0==s1.intern() ); 
System.out.println( s0==s2 );


Enfin, je vais dissiper un autre malentendu :

false 
********** 
false //虽然执行了s1.intern(),但它的返回值没有赋给s1 
true //说明s1.intern()返回的是常量池中”kvill”的引用 
true
Quelqu'un a dit : "Utilisez la méthode String.intern() pour enregistrer une chaîne classe vers un global Dans la table String, si la chaîne Unicode avec la même valeur est déjà dans cette table, alors cette méthode renvoie l'adresse de la chaîne qui existe déjà dans la table. S'il n'y a pas de chaîne avec la même valeur dans la table. table, enregistrez votre propre adresse dans le tableau. " Si je comprends la table de chaînes globale, a-t-il dit comme un pool constant, sa dernière phrase : " S'il n'y a pas de chaîne avec la même valeur dans la table, enregistrez votre propre adresse dans la table. " est faux. :


Regardez l'exemple 4 :



Résultat :

String s1=new String("kvill"); 
String s2=s1.intern(); 
System.out.println( s1==s1.intern() ); 
System.out.println( s1+" "+s2 ); 
System.out.println( s2==s1.intern() );


Dans cette classe nous n'avons pas déclaré de Constante "kvill", il n'y a donc pas de "kvill" dans le pool de constantes au début. Lorsque nous appelons s1.intern(), une nouvelle constante "kvill" est ajoutée au pool de constantes. Le "kvill" d'origine qui ne l'est pas. dans le pool constant existe toujours, et il ne s'agit pas de "enregistrer votre propre adresse dans le pool constant".

false 
kvill kvill 
true
s1==s1.intern() est faux, indiquant que le "kvill" d'origine existe toujours ;


s2 est maintenant l'adresse de "kvill" dans le pool constant, donc s2= =s1.intern() est vrai.

5. Concernant equals() et == :

Pour String, il s'agit simplement de comparer si les séquences Unicode de deux chaînes sont équivalentes, et de renvoyer true si elles sont égales while = ; = compare deux chaînes Si les adresses des chaînes sont les mêmes, c'est-à-dire si ce sont des références à la même chaîne.

6. Il y a beaucoup à dire sur le fait que String soit immuable

Tant que vous savez qu'une instance de String ne changera pas une fois générée, par exemple : String str=" kv" +"ill"+" "+"ans";
Il y a 4 constantes de chaîne. Tout d'abord, "kv" et "ill" génèrent "kvill" et le stockent dans la mémoire, puis "kvill" et " " Génèrent. "kvill" et le stocker en mémoire, et enfin générer "kvill ans"; et attribuer l'adresse de cette chaîne à str, car "l'immuabilité" de String génère de nombreuses
variables temporaires
, c'est pourquoi il il est recommandé d'utiliser StringBuffer, car StringBuffer est modifiable
[Recommandations associées]

1. Tutoriel vidéo gratuit Java

2 Analyse approfondie de la méthode stagiaire() en Java

3. JAVA Résumé de l'expérience dans l'utilisation de la méthode interne()

4. Quel est le concept de méthode interne en Java

5 Analyse. de stagiaire en Java La fonction de ()

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn