71 votes

Questions sur le pool de chaînes Java

Considérons ce code:

 String first = "abc"; 
String second = new String ("abc");
 

Lors de l'utilisation du nouveau mot clé, Java créera à nouveau les abc String , n'est-ce pas? Cela sera-t-il stocké sur le tas normal ou le pool String ? Combien de Strings finiront dans le pool String ?

97voto

Jesper Points 65733

Si vous utilisez l' new mot-clé, un nouveau String objet sera créé. Notez que les objets sont toujours sur le tas - la chaîne de la piscine n'est pas une zone de mémoire qui est distinct dans le tas.

La chaîne de la piscine est comme un cache. Si vous faites cela:

String s = "abc";
String p = "abc";

ensuite, le compilateur Java est assez intelligent pour ne faire qu'un seul String objet, et s et p serez tous les deux en se référant à la même Chaîne de caractères de l'objet. Si vous faites cela:

String s = new String("abc");

ensuite, il y aura un String objet dans la piscine, celui qui représente le littéral "abc", et il y aura un distinct String objet, pas dans la piscine, qui contient une copie du contenu de l'objet mis en commun. Depuis String est immuable en Java, vous n'êtes pas gagne rien en faisant cela; appelant new String("literal") jamais fait sens en Java et est inutilement inefficace.

Notez que vous pouvez appeler intern() sur String objet. Cela mettra l' String objet dans la piscine si elle n'est pas déjà là, et renvoie la référence à la mise en commun de la chaîne. (Si elle était déjà dans la piscine, elle retourne une référence à l'objet qui était déjà là). Voir la documentation de l'API pour que la méthode pour plus d'info.

Voir également la Chaîne de stage (Wikipedia).

12voto

dfa Points 54490

En bytecode, la première affectation est:

Code:
 0: pma #2; //la Chaîne abc
 2: astore_1

tandis que la deuxième est:

 3: nouvelle #3; //la classe java/lang/String
 6: dup
 7: pma #2; //la Chaîne abc
 9: invokespecial #4; //Méthode java/lang/String."":(Ljava/lang/String;)V

donc, la première est la ppol (à la position #2), tandis que le second sera stocké dans le tas.

MODIFIER

Depuis l' CONSTANT_String_info stocker l'index comme U2 (16 bits non signés) de la piscine peut contenir au max 2**16 = 65535 références. Dans le cas vous vous souciez plus d'ici les limites de la JVM.

7voto

loudiyimo Points 299

Chaque fois que votre code crée un littéral de chaîne

par exemple:

 String str="Hello"; (string literal) 
 

la machine virtuelle Java vérifie d'abord le pool de littéraux de chaîne. Si la chaîne existe déjà dans le pool, une référence à l'instance en pool est renvoyée. Si la chaîne n'existe pas dans le pool, un nouvel objet String est instancié puis placé dans le pool. Java peut effectuer cette optimisation car les chaînes sont immuables et peuvent être partagées sans craindre la corruption des données.

2voto

MeBigFatGuy Points 12489

La seule fois où vous devriez utiliser new String (foo) est quand vous voulez casser ==, ce qui est un cas étrange, ou quand foo est une sous-chaîne d'une chaîne beaucoup plus longue ayant une durée de vie limitée, telle que

 String mystring;
{
   String source = getSomeHeinouslyLargeString();
   mystring = new String(source.substring(1,3));
}
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X