Maison >Java >javaDidacticiel >Pourquoi Java crée-t-il un nouvel objet chaîne même lorsqu'une référence au même littéral existe dans le pool de constantes ?

Pourquoi Java crée-t-il un nouvel objet chaîne même lorsqu'une référence au même littéral existe dans le pool de constantes ?

DDD
DDDoriginal
2024-11-03 07:26:02577parcourir

Why Does Java Create a New String Object Even When a Reference to the Same Literal Exists in the Constant Pool?

Java String Constant Pool : internement et égalité de référence

Introduction :

Le String Constant Pool est une fonctionnalité du Machine virtuelle Java (JVM) qui stocke des valeurs constantes, y compris des littéraux de chaîne. Lorsque la JVM rencontre un littéral de chaîne lors de la compilation, elle recherche dans le pool un littéral existant avec la même valeur. Si elle est trouvée, la référence au nouveau littéral est dirigée vers la chaîne existante, évitant ainsi la création d'une nouvelle instance.

Stagiaire avec le mot clé "nouveau" :

Cependant , l'utilisation du mot-clé "new" lors de la création d'un nouvel objet String introduit un comportement différent, comme indiqué dans les références fournies. Alors que la référence au littéral String ("test" dans ce cas) sera toujours placée dans le pool, la JVM est obligée de créer un nouvel objet String au moment de l'exécution au lieu de réutiliser celui du pool.

Question :

Si la référence au littéral String dans le pool est la même que lors de sa création avec "new", la JVM ne devrait-elle pas renvoyer la référence existante au lieu d'en créer une nouvelle ?

Réponse :

Non, la JVM ne renverra pas la référence existante lorsque l'opérateur "nouvel" est utilisé. Au lieu de cela, il créera un nouvel objet String et l'attribuera à la référence créée par le mot-clé "new". En effet :

  • Interning littéral : Lorsque le compilateur rencontre le « test » littéral de chaîne, il recherche une chaîne identique existante dans le pool. Comme il n'y en a pas, un nouvel objet String avec la valeur "test" est créé et placé dans le pool.
  • Construction d'objet avec "new":Lorsque vous créez un nouveau String objet utilisant "new String(literal)", la référence au littéral ("test") est transmise au constructeur. Cela signifie que la référence dans le constructeur a la même valeur que le littéral dans le pool.
  • Création d'un nouvel objet : Cependant, l'opérateur "new" demande à la JVM de créer une nouvelle chaîne objet. Ce nouvel objet est une instance distincte de celui stocké dans le pool, même s'ils font référence à la même valeur littérale.

Exemple :

<code class="java">String literal = "test";
String one = new String(literal);
String two = "test";

System.out.println(literal == two); // true (references in pool)
System.out.println(one == two); // false (distinct objects)</code>

Dans cet exemple, les références « literal » et « two » pointent vers le même objet String dans le pool. Cependant, la référence « one » pointe vers un autre objet String créé par « new ». Par conséquent, la comparaison d'égalité utilisant "==" renvoie false.

Clarification :

L'instruction "Lorsque le compilateur rencontre un littéral de chaîne, il vérifie le pool pour voir si une chaîne identique existe déjà" doit être interprétée comme "dans le pool", ce qui signifie que seuls les littéraux de chaîne qui ont été internés ou explicitement ajoutés au pool seront pris en compte pour l'internement.

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