Maison  >  Article  >  Java  >  Analyse complète du type de données d'objet String en Java

Analyse complète du type de données d'objet String en Java

高洛峰
高洛峰original
2017-01-19 14:35:271526parcourir

1. Tout d'abord, String n'appartient pas aux 8 types de données de base.

Parce que la valeur par défaut de l'objet est nulle, la valeur par défaut de String est également nulle, mais c'est 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.

String str=new String ("kvill"); La différence :
Ici, nous ne parlons pas du tas ou de la pile, nous introduisons juste brièvement le concept simple de pool constant.
Le pool constant fait référence au pool déterminé au moment de la compilation et enregistré 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 :

String s0="kvill"; 
String s1="kvill"; 
String s2="kv" + "ill"; 
System.out.println( s0==s1 ); 
System.out.println( s0==s2 );

Le résultat est :
vrai
vrai
Tout d'abord, nous devons savoir que le résultat est que Java assurez-vous qu’il n’y a qu’une seule copie constante de chaîne.
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" sont également des caractères constantes de chaîne, quand ; une chaîne est composée de plusieurs constantes de chaîne, elle doit elle-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 un "kvill" dans le pool de constantes "Une référence à.
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 :

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 );

Le résultat est :
faux
faux
faux
Dans l'exemple 2, s0 est toujours l'application de "kvill" dans le pool constant, et s1 est dû au fait qu'il 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. Parce que s2 a la seconde moitié de newString("ill"), il ne peut pas être déterminé. au moment de la compilation, il s'agit donc également d'un objet "kvill" Application nouvellement créé ; si vous les comprenez, 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 :

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 );

Le résultat est :
false
************
false //Bien que s1.intern() soit exécuté, sa valeur de retour n'est pas affectée à s1
true //Indique que s1 .intern() renvoie C'est une référence à "kvill" dans le pool de constantes
true
Enfin, je vais dissiper un autre malentendu :
Quelqu'un a dit : "Utilisez la méthode String.intern() pour enregistrer un Classe String 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. la table, enregistrez votre propre adresse dans la table. "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. table" est faux. :
Voir Exemple 4 :

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() );

结果为: 
false 
kvill kvill 
true 
在这个类中我们没有声名一个"kvill"常量,所以常量池中一开始是没有"kvill"的,当我们调用s1.intern()后就在常量池中新添加了一个"kvill"常量,原来的不在常量池中的"kvill"仍然存在,也就不是"将自己的地址注册到常量池中"了。 
s1==s1.intern()为false说明原来的"kvill"仍然存在; 
s2现在为常量池中"kvill"的地址,所以有s2==s1.intern()为true. 

5. 关于equals()和==: 

这个对于String简单来说就是比较两字符串的Unicode序列是否相当,如果相等返回true;而==是比较两字符串的地址是否相同,也就是是否是同一个字符串的引用。 

6. 关于String是不可变的 

这一说又要说很多,大家只要知道String的实例一旦生成就不会再改变了,比如说:String str="kv"+"ill"+" "+"ans"; 
就是有4个字符串常量,首先"kv"和"ill"生成了"kvill"存在内存中,然后"kvill"又和" " 生成 "kvill "存在内存中,最后又和生成了"kvill ans";并把这个字符串的地址赋给了str,就是因为String的"不可变"产生了很多临时变量,这也就是为什么建议用StringBuffer的原因了,因为StringBuffer是可改变的。

更多Java中的String对象数据类型全面解析相关文章请关注PHP中文网!

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