it-swarm.com.de

Verwendung von StringBuilder in Java

Es sollte generell vorgezogen werden, ein StringBuilder für die Verkettung von Zeichenfolgen in Java zu verwenden. Ist das immer so?

Was ich damit meine, ist Folgendes: Ist der Aufwand für das Erstellen eines StringBuilder -Objekts, das Aufrufen der append() -Methode und schließlich der toString() bereits geringer als das Verketten vorhandener Zeichenfolgen mit dem + Operator für zwei Zeichenfolgen, oder ist es nur für mehr (als zwei) Zeichenfolgen ratsam?

Wenn es eine solche Schwelle gibt, worauf kommt es an (vielleicht auf die Länge der Zeichenkette, aber auf welche Weise)?

Und schließlich, würden Sie die Lesbarkeit und Prägnanz der + Verkettung für die Leistung der StringBuilder in kleineren Fällen wie zwei, drei oder vier Zeichenfolgen?

Die explizite Verwendung von StringBuilder für regelmäßige Verkettungen wird unter obsolet Java Optimierungshinweise als veraltet bezeichnet sowie bei Java urbanen Mythen .

335
kostja

Wenn Sie die String-Verkettung in einer Schleife verwenden,

String s = "";
for (int i = 0; i < 100; i++) {
    s += ", " + i;
}

dann sollten Sie ein StringBuilder (nicht StringBuffer) anstelle eines String verwenden, da es viel schneller ist und weniger Speicher verbraucht.

Wenn Sie eine einzelne Aussage haben,

String s = "1, " + "2, " + "3, " + "4, " ...;

dann können Sie Strings verwenden, da der Compiler StringBuilder automatisch verwendet.

469
Ralph

Ralphs Antwort ist fabelhaft. Ich würde eher die StringBuilder-Klasse verwenden, um den String zu erstellen/zu dekorieren, da seine Verwendung eher dem Builder-Muster ähnelt.

public String decorateTheString(String orgStr){
            StringBuilder builder = new StringBuilder();
            builder.append(orgStr);
            builder.deleteCharAt(orgStr.length()-1);
            builder.insert(0,builder.hashCode());
            return builder.toString();
}

Es kann als Helfer/Builder verwendet werden, um den String zu erstellen, nicht den String selbst.

49
zawhtut

Verwenden Sie in der Regel immer den besser lesbaren Code und den Refactor nur, wenn die Leistung ein Problem darstellt. In diesem speziellen Fall optimieren die neuesten JDKs den Code in jedem Fall für die StringBuilder-Version.

Normalerweise müssen Sie dies nur dann manuell durchführen, wenn Sie eine Zeichenfolgenverkettung in einer Schleife oder in einem komplexen Code durchführen, den der Compiler nicht einfach optimieren kann.

38
Riaan Cornelius

Schauen Sie sich Folgendes an: http://www.javaspecialists.eu/archive/Issue068.html und http://www.javaspecialists.eu/archive/Issue105.html

Führen Sie dieselben Tests in Ihrer Umgebung durch und prüfen Sie, ob neueres JDK oder Ihre Java -Implementierung eine Zeichenfolgenoperation besser mit String oder besser mit StringBuilder ausführen.

7
Michał Niklas

Einige Compiler ersetzen möglicherweise keine Zeichenfolgenverkettungen durch StringBuilder-Entsprechungen. Überlegen Sie sich unbedingt, welche Compiler Ihre Quelle verwenden wird, bevor Sie sich auf die Optimierung der Kompilierungszeit verlassen.

5

Der Operator + verwendet public String concat(String str) intern. Diese Methode kopiert die Zeichen der beiden Zeichenfolgen, sodass Speicherbedarf und Laufzeitkomplexität proportional zur Länge der beiden Zeichenfolgen sind. StringBuilder arbeitet effizienter.

Allerdings habe ich gelesen hier , dass der Concatination-Code mit dem + -Operator nach der Veröffentlichung in StringBuilder geändert wird Java 4-Compiler. Dies könnte also überhaupt kein Problem sein. ( Obwohl ich diese Aussage wirklich überprüfen würde, wenn ich in meinem Code darauf angewiesen wäre!)

4
spa

Für zwei Strings ist concat schneller, in anderen Fällen ist StringBuilder die bessere Wahl, siehe meine Erklärung in Verkettungsoperator (+) vs concat ()

4

Das Problem bei der String-Verkettung besteht darin, dass das String-Objekt mit allen damit verbundenen Kosten kopiert wird. StringBuilder ist nicht threadsicher und daher schneller als StringBuffer, was früher die bevorzugte Wahl war Java 5. Als Faustregel gilt, dass Sie keine String-Verkettung in einer Schleife durchführen sollten Ich denke, ein paar Verkettungen tun hier und da nicht weh, solange Sie nicht über Hunderte sprechen, und dies hängt natürlich von Ihren Leistungsanforderungen ab. Wenn Sie in Echtzeit arbeiten, sollten Sie sehr vorsichtig sein.

3
Navi

Das Microsoft-Zertifizierungsmaterial befasst sich mit derselben Frage. In der .NET-Welt macht der Overhead für das StringBuilder-Objekt eine einfache Verkettung von 2 String-Objekten effizienter. Ich würde eine ähnliche Antwort für Java Zeichenketten annehmen.

2
Babak Naffas