Il y a une question comme celle-ci :
Combien d'objets sont créés par new String("aaa") ? La réponse est d'en créer une ou deux. La raison est que si la variable aaa existe dans la zone constante, une seule est créée dans le tas ; si la variable aaa n'existe pas dans la zone constante, une seule est créée dans la zone constante ; et un dans le tas.
Mais les résultats de mon test actuel sont incohérents :
String s1 = new String("aaa");
String s2 = "aaa";
System.out.println(s1 == s2); //false
Si new String("aaa") crée des objets à la fois dans le tas et dans la zone constante, alors pourquoi s2 ne réutilise-t-il pas directement la référence au pool constant de s1 ?
Supplément :
J'ai trouvé que je pensais mal. s1 devrait pointer vers l'élément dans le tas, et s2 pointe vers l'élément dans le pool constant, il est donc correct que les deux ne soient pas égaux. new String("aaa ") crée également des objets dans le pool constant en même temps ?
Ou String s3 = "aa".concat("a"); Ce s3 pointe-t-il vers le tas ou le pool constant ? Peut-il réutiliser les variables dans le pool constant ?
Lorsqu'une instance String appelle la méthode intern(), elle vérifiera s'il existe la même constante de chaîne dans le pool de constantes. Si tel est le cas, sa référence sera renvoyée. Sinon, une chaîne égale à str sera ajoutée à la constante. pool et renvoie sa référence puisque s2 est déjà dans le pool constant, s1.intern() ne le créera pas à nouveau, mais fera directement référence au même "aaa".
Si ce n’est pas assez évident, expérimentons,
Puis ligne de commande
Notez que le pool constant a VV
Question 1 :
String a = "aaa" créera un objet dans le pool constant si le même objet existe dans le pool constant, alors a pointera directement vers l'objet. Et String a = new String("aaa"), s'il existe dans le pool constant, il ne sera pas créé dans le pool constant, mais uniquement dans le tas.
Question 2 :
Trouvez la réponse dans le code source. String s3 = "aa".concat("a"); est en fait équivalent à String s3 = new String("aaa"), qui créera un objet dans le tas.
String ne crée pas une nouvelle instance d'objet String à chaque fois qu'une valeur lui est attribuée ? C'est pourquoi il existe StringBuilder.
Selon la pensée orientée objet, String lui-même sait peut-être mieux s'il faut créer des objets dans le pool constant en même temps. Eh bien, il a une méthode interne().
Les réponses des quelques précédentes sont déjà très bonnes. Permettez-moi d'ajouter que ce que nous disons souvent "mettre la chaîne dans le pool constant" fait référence à mettre la référence de la chaîne dans le pool constant de chaîne (String Pool, qui est essentiellement un pool de constantes de chaîne). table de hachage), la chaîne elle-même est toujours placée sur le tas.