2010-11-23 8 views
9

Ich habe gehört, dass der Compiler (oder war es die JVM?) Automatisch einen StringBuilder für eine Zeichenfolge Verkettung verwenden. Wann ist der richtige Zeitpunkt, um einen explizit zu deklarieren? Ich brauche keinen StringBuffer, um Thread-sicher zu sein.Wann wird StringBuffer/StringBuilder nicht implizit vom Compiler verwendet?

Danke.

+1

mögliche Duplikate von [Was passiert, wenn der Java Compiler viele String-Verkettungen in einer Zeile sieht?] (Http://stackoverflow.com/questions/1296571/what-happens-when-java-compiler-sees-many-string- Verkettungen in einer Zeile) –

+1

Hinweis: Eine Situation, in der kein StringBuilder verwendet wird, ist, wenn die Zeichenfolge zur Kompilierungszeit verkettet werden kann. In diesem Fall erzeugt es nur eine einzige Zeichenfolge (kein StringBuilder) –

+0

BTW: Wenn Sie jemals StringBuffer für Thread-Sicherheit verwenden müssen, haben Sie ein Design-Problem IMHO. : P –

Antwort

14

Der Compiler wird es automatisch für jede String-Verkettung mit "+" verwenden.

Sie würden es normalerweise explizit verwenden, wenn Sie in einer Schleife verketten möchten. Zum Beispiel:

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); 

Eine andere Situation wäre, wenn Sie eine Zeichenfolge über mehrere Methoden aufbauen wollte, oder möglicherweise einige Bits des Gebäudes conditionalise. Wenn Sie die Zeichenkette nicht in einer einzigen Anweisung erstellen (wo Ihnen der Compiler helfen kann), sollten Sie zumindest die Verwendung von StringBuilder in Erwägung ziehen.

+1

Ich denke, es ist erwähnenswert, dass 'StringBuilder' in Fällen wie diesem nicht verwendet wird:' String str = ""; str + = 'ist. –

+0

Ah das macht Sinn, danke! BTW Ich dachte du wärst ein C# Typ; o) –

+0

@Matt interessant, danke für den Tipp –