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 :
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!