Was ist der Hauptunterschied zwischen StringBuffer
und StringBuilder
? Gibt es Leistungsprobleme bei der Entscheidung für eines dieser Probleme?
java
stringbuilder
stringbuffer
schwarzer Tiger
quelle
quelle
StringBuilder
ist schneller alsStringBuffer
weil es nicht istsynchronized
.Hier ist ein einfacher Benchmark-Test:
Ein Testlauf gibt die Zahlen von
2241 ms
forStringBuffer
vs753 ms
for anStringBuilder
.quelle
--> 0
in einer Schleife sehe . Ich brauchte einen Moment, um zu erkennen, was es bedeutet. Wird dies tatsächlich in der Praxis anstelle der üblichen...; i > 0; i--
Syntax verwendet?i -->
Bezug auf die Syntax ist das wirklich ärgerlich ... Ich dachte, es sei zunächst ein Pfeil, wegen der Kommentare zur ASCII-Kunst.main()
Außerdem ist Ihr Benchmark unfair. Es gibt kein Aufwärmen.Grundsätzlich werden
StringBuffer
Methoden synchronisiert, während diesStringBuilder
nicht der Fall ist .Die Operationen sind "fast" gleich, aber die Verwendung synchronisierter Methoden in einem einzelnen Thread ist übertrieben.
Das ist ziemlich viel.
Zitat aus der StringBuilder-API :
Also wurde es gemacht, um es zu ersetzen.
Das gleiche passierte mit
Vector
undArrayList
.quelle
Hashtable
undHashMap
.Verwenden
StringBuilder
Sie es einfach, es sei denn, Sie versuchen wirklich, einen Puffer zwischen Threads zu teilen.StringBuilder
ist der nicht synchronisierte (weniger Overhead = effizienter) jüngere Bruder der ursprünglich synchronisiertenStringBuffer
Klasse.StringBuffer
kam zuerst. Sun war unter allen Bedingungen um Korrektheit bemüht, daher wurde es synchronisiert, um es für alle Fälle threadsicher zu machen.StringBuilder
kam später. Die meisten VerwendungszweckeStringBuffer
waren Single-Thread- Anwendungen, bei denen die Kosten für die Synchronisierung unnötig bezahlt wurden.Da
StringBuilder
ist eine Drop-in - Ersatz fürStringBuffer
, ohne die Synchronisation würde es nicht zwischen irgendwelchen Beispielen Unterschiede geben.Wenn Sie sich zu teilen zwischen Threads versuchen, können Sie verwenden
StringBuffer
, aber prüfen , ob übergeordnete Synchronisation erforderlich ist , zB vielleicht anstelle von String verwenden, sollten Sie die Methoden synchronisieren , die die Stringbuilder verwenden.quelle
Lassen Sie uns zunächst die Ähnlichkeiten sehen : Sowohl StringBuilder als auch StringBuffer sind veränderbar. Das heißt, Sie können den Inhalt an derselben Stelle ändern.
Unterschiede : StringBuffer ist auch veränderbar und synchronisiert. Wobei as StringBuilder veränderbar, aber standardmäßig nicht synchronisiert ist.
Bedeutung von synchronisiert (Synchronisation) : Wenn etwas synchronisiert ist, können mehrere Threads darauf zugreifen und es ohne Probleme oder Nebenwirkungen ändern. StringBuffer ist synchronisiert, sodass Sie es problemlos mit mehreren Threads verwenden können.
Welches wann verwenden? StringBuilder: Wenn Sie einen String benötigen, der geändert werden kann und nur ein Thread darauf zugreift und ihn ändert. StringBuffer: Wenn Sie einen String benötigen, der geändert werden kann, und mehrere Threads darauf zugreifen und ihn ändern.
Hinweis : Verwenden Sie StringBuffer nicht unnötig, dh verwenden Sie ihn nicht, wenn nur ein Thread ihn ändert und darauf zugreift, da er viel Code zum Sperren und Entsperren für die Synchronisierung enthält, der unnötig CPU-Zeit in Anspruch nimmt. Verwenden Sie keine Schlösser, es sei denn, dies ist erforderlich.
quelle
In einzelnen Threads ist StringBuffer dank JVM-Optimierungen nicht wesentlich langsamer als StringBuilder . Und beim Multithreading können Sie einen StringBuilder nicht sicher verwenden.
Hier ist mein Test (kein Benchmark, nur ein Test):
Ergebnisse:
Strings: 319740
Puffer: 23
Builder: 7!
Builder sind also schneller als Puffer und viel schneller als die Verkettung von Zeichenfolgen. Verwenden wir nun einen Executor für mehrere Threads:
Jetzt benötigen StringBuffers 157 ms für 100000 Anhänge. Es ist nicht der gleiche Test, aber im Vergleich zu den vorherigen 37 ms können Sie davon ausgehen, dass die Anhänge von StringBuffers bei Verwendung von Multithreading langsamer sind . Der Grund dafür ist, dass JIT / Hotspot / Compiler / Something Optimierungen vornimmt, wenn festgestellt wird, dass keine Überprüfung der Sperren erforderlich ist.
Aber mit StringBuilder haben Sie java.lang.ArrayIndexOutOfBoundsException , weil ein gleichzeitiger Thread versucht, etwas hinzuzufügen, wo es nicht sollte.
Fazit ist, dass Sie StringBuffers nicht verfolgen müssen. Und wo Sie Threads haben, überlegen Sie, was sie tun, bevor Sie versuchen, ein paar Nanosekunden zu gewinnen.
quelle
withString+="some string"+i+" ; ";
nicht den beiden anderen Schleifen entspricht und daher kein fairer Vergleich ist.StringBuilder wurde in Java 1.5 eingeführt, sodass es mit früheren JVMs nicht funktioniert.
Aus den Javadocs :
quelle
StringBuilder
.Hier sind die Unterschiede, die ich bemerkt habe:
StringBuffer: -
StringBuilder: -
Verbreitete Sache :-
quelle
StringBuffer
StringBuilder
StringBuffer
ohne weitere Änderungenquelle
append
zweimal, oderappend
undtoString
ist nicht nicht sicher.StringBuilder ist nicht threadsicher. String Buffer ist. Mehr Infos hier .
BEARBEITEN: Was die Leistung betrifft, ist StringBuilder nach dem Start des Hotspots der Gewinner. Bei kleinen Iterationen ist der Leistungsunterschied jedoch vernachlässigbar.
quelle
StringBuilder
undStringBuffer
sind fast gleich. Der Unterschied ist, dassStringBuffer
synchronisiert ist undStringBuilder
nicht. Obwohl,StringBuilder
ist schneller alsStringBuffer
, ist der Unterschied in der Leistung sehr gering.StringBuilder
ist der Ersatz einer SUN vonStringBuffer
. Es wird lediglich die Synchronisation aller öffentlichen Methoden vermieden. Stattdessen ist ihre Funktionalität dieselbe.Beispiel für eine gute Verwendung:
Wenn sich Ihr Text ändern wird und von mehreren Threads verwendet wird, ist es besser, ihn zu verwenden
StringBuffer
. Wenn sich Ihr Text ändern wird, aber von einem einzelnen Thread verwendet wird, verwenden SieStringBuilder
.quelle
StringBuffer
StringBuffer ist veränderbar, dh man kann den Wert des Objekts ändern. Das über StringBuffer erstellte Objekt wird im Heap gespeichert. StringBuffer hat die gleichen Methoden wie der StringBuilder, aber jede Methode in StringBuffer ist synchronisiert, dh StringBuffer ist threadsicher.
Aus diesem Grund können nicht zwei Threads gleichzeitig auf dieselbe Methode zugreifen. Auf jede Methode kann jeweils ein Thread zugreifen.
Thread-sicher zu sein hat jedoch auch Nachteile, da die Leistung des StringBuffer aufgrund der thread-sicheren Eigenschaft beeinträchtigt wird. Daher ist StringBuilder schneller als der StringBuffer, wenn dieselben Methoden für jede Klasse aufgerufen werden.
Der StringBuffer-Wert kann geändert werden. Dies bedeutet, dass er dem neuen Wert zugewiesen werden kann. Heutzutage ist es eine häufig gestellte Interviewfrage, die Unterschiede zwischen den oben genannten Klassen. Der String-Puffer kann mithilfe der toString () -Methode in den String konvertiert werden.
StringBuilder
StringBuilder ist dasselbe wie der StringBuffer, dh er speichert das Objekt im Heap und kann auch geändert werden. Der Hauptunterschied zwischen StringBuffer und StringBuilder besteht darin, dass StringBuilder auch nicht threadsicher ist. StringBuilder ist schnell, da es nicht threadsicher ist.
Ressource: String Vs StringBuffer Vs StringBuilder
quelle
String
ist eine unveränderliche.StringBuffer
ist veränderlich und synchronisiert.StringBuilder
ist auch veränderlich, aber nicht synchronisiert.quelle
Der Javadoc erklärt den Unterschied:
quelle
StringBuilder
(eingeführt in Java 5) ist identisch mitStringBuffer
, außer dass seine Methoden nicht synchronisiert sind. Dies bedeutet, dass es eine bessere Leistung als das letztere hat, aber der Nachteil ist, dass es nicht threadsicher ist.Lesen Sie das Tutorial für weitere Details.
quelle
Ein einfaches Programm, das den Unterschied zwischen StringBuffer und StringBuilder veranschaulicht:
quelle
StringBuffer wird zum Speichern von Zeichenfolgen verwendet, die geändert werden (String-Objekte können nicht geändert werden). Es wird bei Bedarf automatisch erweitert. Verwandte Klassen: String, CharSequence.
StringBuilder wurde in Java 5 hinzugefügt. Es ist in jeder Hinsicht identisch mit StringBuffer, außer dass es nicht synchronisiert ist. Wenn also mehrere Threads gleichzeitig darauf zugreifen, kann es zu Problemen kommen. Bei Single-Threaded-Programmen ist der StringBuilder der häufigste Fall, wenn der Synchronisierungsaufwand vermieden wird, der StringBuilder etwas schneller.
quelle
StringBuilder
sind normalerweise lokal für eine Methode, bei der sie nur für einen Thread sichtbar sind.StringBuffer
ist synchronisiert, aberStringBuilder
nicht. InfolgedessenStringBuilder
ist schneller alsStringBuffer
.quelle
StringBuffer ist veränderbar. Es kann sich in Länge und Inhalt ändern. StringBuffers sind threadsicher, dh sie verfügen über synchronisierte Methoden zur Steuerung des Zugriffs, sodass jeweils nur ein Thread auf den synchronisierten Code eines StringBuffer-Objekts zugreifen kann. Daher können StringBuffer-Objekte in einer Umgebung mit mehreren Threads, in der möglicherweise mehrere Threads gleichzeitig versuchen, auf dasselbe StringBuffer-Objekt zuzugreifen, im Allgemeinen sicher verwendet werden.
StringBuilder Die StringBuilder-Klasse ist StringBuffer sehr ähnlich, außer dass ihr Zugriff nicht synchronisiert ist, sodass sie nicht threadsicher ist. Wenn Sie nicht synchronisiert sind, kann die Leistung von StringBuilder besser sein als die von StringBuffer. Wenn Sie in einer Umgebung mit einem Thread arbeiten, kann die Verwendung von StringBuilder anstelle von StringBuffer zu einer Leistungssteigerung führen. Dies gilt auch für andere Situationen, z. B. eine lokale StringBuilder-Variable (dh eine Variable innerhalb einer Methode), in der nur ein Thread auf ein StringBuilder-Objekt zugreift.
quelle
StringBuffer:
StringBuilder
quelle
String c = a + b
ist gleichbedeutend mitString c = new StringBuilder().append(a).append(b).toString()
, also ist es nicht schneller. Es ist nur , dass Sie eine neue für jede Saite assignation erstellen, während Sie nur eine haben könnte (String d = a + b; d = d + c;
istString d = new StringBuilder().append(a).append(b).toString(); d = new StringBuilder().append(d).append(c).toString();
währendStringBuilder sb = new StringBuilder(); sb.append(a).append(b); sb.append(c); String d = sb.toString();
würde man String Instanciation speichern).String-Builder :
String-Puffer
Es wird empfohlen, nach Möglichkeit StringBuilder zu verwenden, da dieser schneller als StringBuffer ist. Wenn jedoch die Thread-Sicherheit erforderlich ist, sind StringBuffer-Objekte die beste Option.
quelle
Bessere Verwendung,
StringBuilder
da es nicht synchronisiert ist und daher eine bessere Leistung bietet.StringBuilder
ist ein Ersatz für die älterenStringBuffer
.quelle
StringBu(ff|ild)er
ist das eine lokale Variable, die nur von einem einzelnen Thread verwendet wird.Da
StringBuffer
es synchronisiert ist, erfordert es einige zusätzliche Anstrengungen, daher ist es aufgrund der Leistung etwas langsamer alsStringBuilder
.quelle
Es gibt keine grundlegenden Unterschiede zwischen
StringBuilder
undStringBuffer
, es gibt nur wenige Unterschiede zwischen ihnen. InStringBuffer
den Methoden werden synchronisiert. Dies bedeutet, dass jeweils nur ein Thread mit ihnen arbeiten kann. Wenn es mehr als einen Thread gibt, muss der zweite Thread warten, bis der erste beendet ist, und der dritte muss warten, bis der erste und der zweite Thread beendet sind und so weiter. Dies macht den Prozess sehr langsam und damit die Leistung im Fall vonStringBuffer
gering.Ist andererseits
StringBuilder
nicht synchronisiert. Dies bedeutet, dass mehrere Threads gleichzeitig an demselbenStringBuilder
Objekt arbeiten können. Dies macht den Prozess sehr schnell und daher ist die Leistung vonStringBuilder
hoch.quelle
A
String
ist ein unveränderliches Objekt, was bedeutet, dass der Wert nicht geändert werden kann, während erStringBuffer
veränderbar ist.Das
StringBuffer
ist synchronisiert und daher threadsicher, währendStringBuilder
es nicht nur für Instanzen mit einem Thread geeignet ist.quelle
Der Hauptunterschied besteht darin, dass er synchronisiert
StringBuffer
ist, aber nicht.StringBuilder
Wenn Sie mehr als einen Thread verwenden müssen, wird StringBuffer empfohlen. Die AusführungsgeschwindigkeitStringBuilder
ist jedoch schneller alsStringBuffer
, da er nicht synchronisiert ist.quelle
Überprüfen Sie die Interna der synchronisierten Append-Methode
StringBuffer
und der nicht synchronisierten Append-Methode vonStringBuilder
.StringBuffer :
StringBuilder :
Da Anhängen ist
synchronized
,StringBuffer
hat Leistung Overhead im Vergleich zuStrinbBuilder
Multithreading-Szenario. Solange Sie den Puffer nicht für mehrere Threads freigeben, verwenden SieStringBuilder
, was aufgrund des Fehlens vonsynchronized
Methoden zum Anhängen schnell ist .quelle
Hier ist das Ergebnis des Leistungstests für String vs StringBuffer vs StringBuilder . Schließlich gewann StringBuilder den Test. Siehe unten für Testcode und Ergebnis.
Code :
Führe mich auf ideone aus
Ergebnis :
100000 Iteration zum Hinzufügen eines einzelnen Textes
10000 Iteration zum Hinzufügen eines einzelnen Textes
quelle
quelle
StringBuffer ist synchronisiert und threadsicher, StringBuilder ist nicht synchronisiert und schneller.
quelle