2010-11-23 45 views
9

J'ai entendu dire que le compilateur (ou était-ce la JVM?) Utilisera automatiquement un StringBuilder pour une concaténation de chaînes. Quel est le bon moment pour en déclarer une explicitement? Je n'ai pas besoin d'un StringBuffer pour être thread-safe.Quand StringBuffer/StringBuilder n'est pas implicitement utilisé par le compilateur?

Merci.

+1

duplication possible de [Que se passe-t-il lorsque le compilateur Java voit plusieurs concaténations de chaînes sur une ligne?] (Http://stackoverflow.com/questions/1296571/what-happens-when-java-compiler-sees-many-string- concaténations-dans-une-ligne) –

+1

Remarque: une situation où il n'utilisera pas StringBuilder est lorsque la chaîne peut être concaténée au moment de la compilation. Dans ce cas, il produit juste une seule chaîne (pas StringBuilder) –

+0

BTW: Si vous avez besoin d'utiliser StringBuffer pour la sécurité des threads, vous avez un problème de conception IMHO. : P –

Répondre

14

Le compilateur l'utilisera automatiquement pour toute concaténation de chaîne en utilisant "+".

Vous l'utiliseriez généralement explicitement si vous vouliez concaténer en boucle. Par exemple:

StringBuilder builder = new StringBuilder(); 
for (String name : names) 
{ 
    builder.append(name); 
    builder.append(", "); 
} 
if (builder.length() > 0) 
{ 
    builder.setLength(builder.length() - 2); 
} 
System.out.println("Names: " + builder); 

Une autre situation serait où vous vouliez construire une chaîne sur plusieurs méthodes, ou peut-être conditionalise quelques bits du bâtiment. Fondamentalement, si vous ne construisez pas la chaîne dans une seule instruction (où le compilateur peut vous aider), vous devriez au moins envisager d'utiliser StringBuilder.

+1

Je pense qu'il vaut la peine de mentionner que 'StringBuilder' ne sera pas utilisé dans les cas suivants:' String str = ""; str + = '. –

+0

Ah ça a du sens, merci! BTW je pensais que vous étiez un gars C#; o) –

+0

@Matt intéressant, merci pour le conseil –