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
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.
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
Lorsque la version de jdk est supérieure à 1.6, le résultat de l'exécution du code ci-dessus est
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()
Dans jdk1.7 et versions ultérieures, appelez stagiaire()
Ensuite, nous expliquerons pourquoi le code ci-dessus obtiendra un
true
et unfalse
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 lorsquestr1.intern()
est exécuté, puisque le pool de constantes. n'est pas une chaîneab
n'existe pas, jvm La référence destr1
sera enregistrée dans le pool de constantes et la référence destr1
sera renvoyée. Par conséquent, la sortie de la deuxième ligne de code esttrue
.str2
utilise la constante littéralec
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éralec
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 duc
reconstruit, donc la sortie de la ligne 4 du code eststr2
.false
Un objet String appelant la méthode
intern()
trouvera d'abord la constanteequals
de l'objet dans le pool de constantes et la renverra s'il ne la trouve pas, ajoutez une constanteequals
de l'objet au pool de constantes. et retournez-le. Application des constantes. La sortie deSystem.out.println(str1.intern() == str1);
esttrue
carstr1
devient une référence à une constante dans le pool de constantes après l'opérationappend
.System.out.println(str2.intern() == str2);
est affiché sous la formefalse
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
estfalse
outrue
, principalement en fonction du fait questr
est une constante dans le pool de constantes. Si c'est le cas, le résultat esttrue
, sinon il. c'est justefalse
.