Ich bin gerade StringBuilder
zum ersten Mal darauf gestoßen und war überrascht, da Java bereits eine sehr leistungsfähige String
Klasse hat, die das Anhängen ermöglicht.
Warum eine zweite String
Klasse?
Wo kann ich mehr erfahren StringBuilder
?
java
string
stringbuilder
an00b
quelle
quelle
Antworten:
String
erlaubt kein Anhängen. Jede Methode, die Sie für ein aufrufen,String
erstellt ein neues Objekt und gibt es zurück. Dies liegt daran, dassString
es unveränderlich ist - es kann seinen internen Zustand nicht ändern.Auf der anderen Seite
StringBuilder
ist veränderlich. Wenn Sie es aufrufenappend(..)
, wird das interne char-Array geändert, anstatt ein neues Zeichenfolgenobjekt zu erstellen.Somit ist es effizienter zu haben:
anstatt
str += i
, was 500 neue String-Objekte erstellen würde.Beachten Sie, dass ich im Beispiel eine Schleife verwende. Wie Helios in den Kommentaren festhält, übersetzt der Compiler Ausdrücke automatisch
String d = a + b + c
in etwas ÄhnlichesBeachten Sie auch, dass es
StringBuffer
zusätzlich zu gibtStringBuilder
. Der Unterschied besteht darin, dass erstere Methoden synchronisiert haben. Wenn Sie es als lokale Variable verwenden, verwenden SieStringBuilder
. Wenn es vorkommt, dass mehrere Threads darauf zugreifen können, verwenden SieStringBuffer
(das ist seltener).quelle
Hier ist ein konkretes Beispiel dafür, warum -
Wie Sie sehen, ist der Leistungsunterschied erheblich.
quelle
s = sb.ToString();
am Ende angeben, damit Sie zumindest in beiden Beispielen dasselbe getan haben (Ergebnis ist astring
).Die String-Klasse ist unveränderlich, während StringBuilder veränderbar ist.
Der obige Code erstellt zwei Objekte, da String unveränderlich ist
Der obige Code erstellt nur ein Objekt, da StringBuilder nicht unveränderlich ist.
Lektion: Wenn String mehrmals bearbeitet / aktualisiert / angehängt werden muss, ist StringBuilder im Vergleich zu String effizienter.
quelle
StringBuilder dient zum Erstellen von Strings. Insbesondere bauen sie auf sehr performante Weise. Die String-Klasse ist für viele Dinge gut, aber sie hat tatsächlich eine wirklich schreckliche Leistung, wenn ein neuer String aus kleineren String-Teilen zusammengesetzt wird, da jeder neue String ein völlig neuer, neu zugewiesener String ist. (Es ist unveränderlich ) StringBuilder behält dieselbe Sequenz bei und ändert sie ( veränderbar ).
quelle
Die StringBuilder-Klasse ist veränderbar und ermöglicht es Ihnen, im Gegensatz zu String den Inhalt des Strings zu ändern, ohne weitere String-Objekte erstellen zu müssen. Dies kann ein Leistungsgewinn sein, wenn Sie einen String stark ändern. Es gibt auch ein Gegenstück zu StringBuilder namens StringBuffer, das ebenfalls synchronisiert ist, sodass es ideal für Multithread-Umgebungen ist.
Das größte Problem mit String ist, dass jede Operation, die Sie damit ausführen, immer ein neues Objekt zurückgibt, z. B.:
quelle
StringBuilder ist gut, wenn Sie mit größeren Strings arbeiten. Es hilft Ihnen, die Leistung zu verbessern.
Hier ist ein Artikel , den ich hilfreich fand.
Eine schnelle Google-Suche hätte Ihnen helfen können. Jetzt haben Sie 7 verschiedene Personen eingestellt, um eine Google-Suche für Sie durchzuführen. :) :)
quelle
Um genau zu sein, ist StringBuilder, der alle Zeichenfolgen hinzufügt, O (N), während das Hinzufügen von Zeichenfolgen O (N ^ 2) ist. Bei der Überprüfung des Quellcodes wird dies intern erreicht, indem ein veränderbares Array von Zeichen beibehalten wird. StringBuilder verwendet die Array-Längen-Duplizierungstechnik, um eine ammortisierte O (N ^ 2) -Leistung zu erzielen , auf Kosten einer möglichen Verdoppelung des erforderlichen Speichers. Sie können am Ende trimToSize aufrufen, um dies zu beheben. In der Regel werden StringBuilder-Objekte jedoch nur vorübergehend verwendet. Sie können die Leistung weiter verbessern, indem Sie eine gute Startschätzung für die endgültige Zeichenfolgengröße abgeben.
quelle
Effizienz.
Jedes Mal, wenn Sie Zeichenfolgen verketten, wird eine neue Zeichenfolge erstellt. Beispielsweise:
Dadurch wird eine neue temporäre Zeichenfolge erstellt, in die "a" und "b" kopiert werden, um "ab" zu erhalten. Dann wird eine weitere neue temporäre Zeichenfolge erstellt, in die "ab" und "c" kopiert werden, um "abc" zu erhalten. Dieses Ergebnis wird dann zugeordnet
out
.Das Ergebnis ist ein Schlemiel the Painter-Algorithmus der O (n²) (quadratischen) Zeitkomplexität.
StringBuilder
Auf der anderen Seite können Sie Zeichenfolgen an Ort und Stelle anhängen und die Größe der Ausgabezeichenfolge nach Bedarf ändern.quelle
Java hat String, StringBuffer und StringBuilder:
String: Es ist unveränderlich
StringBuffer: Es ist veränderlich und ThreadSafe
StringBuilder: Es ist veränderlich, aber nicht ThreadSafe, eingeführt in Java 1.5
Zeichenfolge zB:
}}
Ausgabe: Es werden 10 verschiedene Zeichenfolgen anstelle von nur 1 Zeichenfolge erstellt.
StringBuilder zB: Es wird nur 1 StringBuilder-Objekt erstellt.
quelle