Maison > Questions et réponses > le corps du texte
String str1 = new StringBuilder("a").append("b").toString();
System.out.println(str1.intern() == str1);
String str2 = new StringBuilder("c").toString();
System.out.println(str2.intern() == str2);
为什么输出结果是:
true
false
高洛峰2017-04-17 17:51:54
String str1 = new StringBuilder("a").append("b").toString(); //1
System.out.println(str1.intern() == str1); //2
String str2 = new StringBuilder("c").toString(); //3
System.out.println(str2.intern() == str2); //4
Il existe une zone appelée Pool de constantes de chaîne dans le modèle de mémoire Java, qui stocke les constantes de chaîne.
Tout d'abord, lorsque la version de jdk est inférieure ou égale à 1.6, le résultat de l'exécution du code ci-dessus sera
false
false
Lorsque la version de jdk est supérieure à 1.6, le résultat de l'exécution du code ci-dessus est
true
false
La raison des deux résultats différents ci-dessus est que jvm implémente la méthode intern() différemment.
Dans jdk1.6 et avant, appelez stagiaire()
S'il n'y a pas de chaîne de valeur égale dans le pool constant, jvm copiera une chaîne dans le pool de création et renverra la chaîne dans le pool constant.
Dans jdk1.7 et versions ultérieures, appelez stagiaire()
S'il n'y a pas de chaîne de valeur égale dans le pool constant, jvm enregistre simplement la référence de la chaîne actuelle dans le pool constant et renvoie la référence de la chaîne actuelle.
Ensuite, nous expliquerons pourquoi le code ci-dessus obtiendra un true
et un false
dans jdk1.7 et supérieur.
Lorsque la classe contenant le code ci-dessus est chargée par la JVM, les constantes littérales a
, b
, c
seront chargées dans le pool de constantes de chaîne lorsque str1.intern()
est exécuté, puisque le pool de constantes. n'est pas une chaîne ab
n'existe pas, jvm La référence de str1
sera enregistrée dans le pool de constantes et la référence de str1
sera renvoyée. Par conséquent, la sortie de la deuxième ligne de code est true
.
str2
utilise la constante littérale c
pour construire une nouvelle chaîne. La référence de cette chaîne est différente de la référence de la chaîne littérale c
dans le pool de constantes. str2.intern()
existe déjà dans le pool constant, et le jvm renvoie directement la référence dans le pool constant, qui est différente du c
reconstruit, donc la sortie de la ligne 4 du code est str2
. false
ringa_lee2017-04-17 17:51:54
Un objet String appelant la méthode intern()
trouvera d'abord la constante equals
de l'objet dans le pool de constantes et la renverra s'il ne la trouve pas, ajoutez une constante equals
de l'objet au pool de constantes. et retournez-le. Application des constantes. La sortie de System.out.println(str1.intern() == str1);
est true
car str1
devient une référence à une constante dans le pool de constantes après l'opération append
. System.out.println(str2.intern() == str2);
est affiché sous la forme false
car str2 est une référence à une variable et n'est pas dans le pool de constantes.
Par conséquent, nous devons juger si str.intern() == str
est false
ou true
, principalement en fonction du fait que str
est une constante dans le pool de constantes. Si c'est le cas, le résultat est true
, sinon il. c'est juste false
.