1. Tout d’abord, String n’appartient pas aux 8 types de données de base, c’est un objet.
É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 qui possède certaines caractéristiques que les 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. Chaîne str="kvill";
La différence entre String str=new String ("kvill"); :
Ici, nous ne parlerons pas de tas ou de pile, mais introduisons simplement le concept simple de pool constant.
Le pool constant fait référence au pool déterminé au moment de la compilation et stocké dans le pool compilé. Quelques données dans le fichier de classe. Il comprend des constantes dans les classes, méthodes, interfaces, etc., ainsi que des constantes de chaîne.
Regardez l'exemple 1 :
Copiez le code comme suit :
Chaîne s0="kvill";
Chaîne s1="kvill";
Chaîne s2="kv" + "malade" ;
System.out.println( s0==s1 );
System.out.println( s0==s2 );
Le résultat est :
vrai
vrai
Tout d’abord, nous devons savoir que Java garantira qu’il n’existe qu’une seule copie d’une constante chaîne.
Étant donné que "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" sont également des constantes de chaîne. Lorsqu'une chaîne est concaténée par plusieurs constantes de chaîne, il doit lui-même être une constante de chaîne, donc s2 est également analysé en une constante de chaîne au moment de la compilation, donc s2 est également l'un des "kvill" dans le pool de constantes Quote.
Nous obtenons donc s0==s1==s2;
Les chaînes créées avec new String() ne sont pas des constantes et ne peuvent pas être déterminées au moment de la compilation, donc les chaînes créées avec new String() ne sont pas placées dans le pool de constantes, elles ont leur propre espace d'adressage.
Regardez l'exemple 2 :
Copiez le code comme suit :
Chaîne s0="kvill";
Chaîne s1=nouvelle Chaîne("kvill");
Chaîne s2="kv" + new String("mauvaise");
System.out.println( s0==s1 );
System.out.println( s0==s2 );
System.out.println( s1==s2 );
Le résultat est :
FAUX
FAUX
FAUX
Dans l'exemple 2, s0 est toujours l'application de "kvill" dans le pool de constantes. Puisque s1 ne peut pas être déterminé au moment de la compilation, il s'agit d'une référence au nouvel objet "kvill" créé au moment de l'exécution. Puisque s2 possède la seconde moitié de newString. ("ill"), c'est aussi Il ne peut pas être déterminé au moment de la compilation, c'est donc aussi une application d'un objet nouvellement créé "kvill" si vous comprenez cela, vous saurez pourquoi ce résultat est obtenu.
4. String.intern() :
Permettez-moi d'ajouter un point supplémentaire : existe dans. Le pool de constantes dans le fichier de classe 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 vérifie s'il existe une constante de chaîne avec le même Unicode dans le pool de constantes. Si tel est le cas, elle renvoie. sa référence. Si sinon, 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 :
Copiez le code comme suit :
Chaîne s0= "kvill" ;
Chaîne s1=nouvelle Chaîne("kvill");
Chaîne s2=nouvelle Chaîne("kvill");
System.out.println( s0==s1 );
System.out.println( "**********" );
s1.intern();
s2=s2.intern(); //Attribuer la référence de "kvill" dans le pool de constantes à s2
System.out.println(s0==s1);
System.out.println( s0==s1.intern() );
System.out.println( s0==s2 );
Le résultat est :
FAUX
**********
false //Bien que s1.intern() soit exécuté, sa valeur de retour n'est pas affectée à s1
true //Indique que s1.intern() renvoie une référence à "kvill" dans le pool de constantes
vrai
Enfin, permettez-moi de dissiper un autre malentendu :
Quelqu'un a dit : « Utilisez la méthode String.intern() pour enregistrer une classe String dans une table String globale. Si une chaîne Unicode avec la même valeur est déjà dans cette table, alors cette méthode renvoie la chaîne déjà dans la table. s'il n'y a pas de chaîne avec la même valeur dans le tableau, 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, "Si dans S'il n'y a pas de chaîne avec le même valeur dans le tableau, il est erroné d'enregistrer votre propre adresse dans le tableau :
Regardez l'exemple 4 :
Copiez le code comme suit :
Chaîne s1=nouvelle Chaîne("kvill");
Chaîne s2=s1.intern();
System.out.println( s1==s1.intern() );
System.out.println( s1+" "+s2 );
System.out.println( s2==s1.intern() );
Le résultat est :
FAUX
kvill kvill
vrai
Dans cette classe, nous n'avons pas déclaré de constante "kvill", donc il n'y avait pas de "kvill" dans le pool de constantes au début. Lorsque nous avons appelé s1.intern(), une nouvelle constante "kvill" a été ajoutée au pool de constantes. . Il s'avère que le "kvill" qui n'est pas dans le pool constant existe toujours, ce qui signifie qu'il "n'enregistre pas sa propre adresse dans le pool constant".
s1==s1.intern() est faux, indiquant que le "kvill" original existe toujours ;
s2 est maintenant l'adresse de "kvill" dans le pool de constantes, donc s2==s1.intern() est vrai.
5. À propos de 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, et == de comparer si les adresses des deux chaînes sont les mêmes, c'est-à-dire si ce sont des références ; à la même chaîne.
6. À propos de String est immuable
Il y a beaucoup à dire à ce sujet 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. Premièrement, "kv" et "ill" génèrent "kvill" qui est stocké dans la mémoire. Ensuite, "kvill" est combiné avec " " pour générer "kvill" et est enfin stocké dans la mémoire. est combiné avec "kvill ans" pour 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 est recommandé d'utiliser StringBuffer, car StringBuffer est changeable.