Tout d'abord, nous devons être clairs qu'il y a toujours une différence dans la méthode interne de la classe String dans JDK1.6 et JDK1.7:
Stagiaire dans JDK1.6:
Lorsque vous appelez la méthode interne, accédez d'abord au pool constant pour voir s'il y a une valeur identique à la valeur de chaîne actuelle. S'il existe, il renverra directement une référence à la valeur de chaîne dans le pool constant; S'il n'existe pas, la chaîne du tas d'origine sera copiée dans le pool constant.
Stagiaire dans JDK1.7:
Lorsque vous appelez la méthode interne, accédez d'abord au pool constant pour voir s'il y a une valeur identique à la valeur de chaîne actuelle. S'il existe, il renverra directement une référence à la valeur de chaîne dans le pool constant; S'il n'existe pas, il ne placera la référence qu'au tas d'origine dans le pool constant et ne copiera pas la chaîne entière dans le pool constant.
Cela signifie que JDK1.6 et JDK1.7 gèrent différemment lorsque cette chaîne n'existe pas dans le pool constant.
Ce qui suit est un exemple pour vérifier et expliquer:
Exemple:
public static void main (String [] args) {String str = "str" + new String ("01"); ① str.intern (); ② String str1 = "str01"; ③ System.out.println (str == str1); String str2 = new String ("str01"); ④ str2.intern (); ⑤ String str3 = "str01"; ⑥ System.out.println (str2 == str3); String str4 = "str01"; ⑦ String str5 = new String ("str") + new String ("01"); ⑧ str5.intern (); ⑨ System.out.println (str4 == str5); Dans JDK1.6, le résultat de sortie est:
FAUX
FAUX
FAUX
expliquer:
① Pendant l'exécution, un objet de chaîne STR avec la valeur "str01" sera créé dans la mémoire du tas, et une constante "Str" et "01" sera créée dans le pool constant;
② Lors de l'exécution, allez d'abord au pool constant pour vérifier s'il y a une valeur constante de "str01" et constatez qu'il n'existe pas. La méthode de JDK1.6 consiste à générer une copie de la chaîne "str01" dans le pool constant;
③ Pendant l'exécution, un objet "STR01" sera créé dans le pool constant, et il sera constaté qu'il existe déjà, il ne sera donc pas créé nouveau;
La raison de la première sortie fausse est que STR pointe vers "STR01" dans la mémoire du tas, tandis que STR1 pointe vers "STR01" dans le pool constant;
④ Lors de l'exécution, un objet de chaîne STR2 avec une valeur de "str01" sera créé dans la mémoire du tas, et une constante avec une valeur de "str01" sera créée dans le pool constant;
⑤ Lors de l'exécution, accédez d'abord au pool constant pour vérifier s'il y a une valeur constante de "str01". Lorsqu'il est constaté qu'il existe, il renverra directement cette référence constante;
⑥ Pendant l'exécution, une valeur constante de "STR01" sera créée dans le pool constant. S'il est constaté qu'il existe déjà, il ne sera pas créé;
La raison de la deuxième sortie fausse est que STR2 pointe vers "STR01" dans la mémoire du tas, tandis que STR3 pointe vers "STR01" dans le pool constant;
⑦ Pendant l'exécution, une valeur constante de "str01" sera créée dans le pool constant;
⑧La exécution, un objet de chaîne STR5 avec la valeur "str01" sera créé dans la mémoire du tas, et une constante "Str" et "01" sera créée dans le pool constant;
⑨ Lors de l'exécution, le pool constant sera utilisé pour vérifier s'il y a une valeur constante de "str01". S'il est trouvé, il renverra directement cette référence constante;
La raison de la troisième sortie fausse est que STR5 pointe vers "STR01" dans la mémoire du tas, tandis que STR4 pointe vers "STR01" dans le pool constant;
Dans JDK1.7, le résultat de sortie est:
vrai
FAUX
FAUX
expliquer:
J'ai trouvé que seul le premier résultat de sortie est différent, nous expliquons donc seulement la raison de la première:
① Pendant l'exécution, un objet de chaîne STR avec la valeur "str01" sera créé dans la mémoire du tas, et une constante "str" et "01" sera créée dans le pool constant; (Ce n'est pas différent de JDK1.6)
② Lors de l'exécution, allez d'abord au pool constant pour vérifier s'il y a une valeur constante de "str01" et constatez qu'il n'existe pas. La méthode de JDK1.7 consiste à copier la référence de "STR01" dans la mémoire du tas dans le pool constant;
③ Pendant l'exécution, un objet "STR01" sera créé dans le pool constant, et il sera constaté qu'il existe déjà, il ne sera donc pas créé nouveau;
Ensuite, à l'heure actuelle, STR et STR1 pointent tous les deux vers la valeur de "STR01" dans la mémoire du tas, donc les deux sont égaux;
Ce qui précède est une comparaison de la méthode interne de la classe String dans JDK1.6 et JDK1.7. Il y a des différences. Les amis qui en ont besoin peuvent y faire référence.