Maison  >  Article  >  Java  >  Comment le pool de chaînes Java gère-t-il `new String(\"literal\")` ?

Comment le pool de chaînes Java gère-t-il `new String(\"literal\")` ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-11-03 12:11:29841parcourir

How Does the Java String Pool Handle `new String(

Pool de constantes de chaîne : clarifier les idées fausses

En Java, les "littéraux de chaîne" comme "abc" sont internés, ce qui signifie que plusieurs références à la même valeur littérale pointent vers la même instance en mémoire. Cela permet d'optimiser l'utilisation de la mémoire et les performances. Cependant, utiliser new avec un littéral String, tel que new String("abc"), crée un nouvel objet String, même si le littéral existe déjà dans le pool String.

Deux déclarations concernant le pool String ont soulevé une certaine confusion :

  • Déclaration 1 : "Lorsque le compilateur rencontre un littéral String, il vérifie le pool pour voir si une chaîne identique existe déjà."
  • Déclaration 2 : "Lorsque vous utilisez new avec un littéral String, les références au littéral sont toujours placées dans la table constante (le pool de littéraux String), mais la JVM crée un nouvel objet String au moment de l'exécution. "

Pour clarifier, la déclaration 2 implique que les littéraux de chaîne sont toujours internés dans le pool de chaînes même lors de la création d'un objet avec new, mais qu'un nouvel objet est construit malgré tout.

Dans le exemple :

String one = new String("test");
String two = "test";

La référence transmise à new String("test") est la même que deux en raison d'un stage. Cependant, un nouvel objet String avec la valeur "test" est créé et affecté à un.

Ainsi, il existe deux objets String distincts avec la valeur "test" : un dans le pool de constantes (référencé par deux) et un nouveau créé avec new (référencé par un). C'est pourquoi one.equals(two) est vrai (ils ont la même valeur), mais one == two est faux (ils font référence à des objets différents).

La déclaration 1 doit être reformulée comme suit : "Lorsque le compilateur rencontre un littéral String, il vérifie si une String identique existe déjà _dans le pool_." Les chaînes ne sont internées que si elles sont explicitement internées ou utilisées comme littéraux dans les définitions de classe.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

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