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
?
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
?
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, dass String
es unveränderlich ist - es kann seinen internen Zustand nicht ändern.
Auf der anderen Seite StringBuilder
ist veränderlich. Wenn Sie es aufrufen append(..)
, wird das interne char-Array geändert, anstatt ein neues Zeichenfolgenobjekt zu erstellen.
Somit ist es effizienter zu haben:
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 500; i ++) {
sb.append(i);
}
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 Ähnliches
String d = new StringBuilder(a).append(b).append(c).toString();
Beachten Sie auch, dass es StringBuffer
zusätzlich zu gibt StringBuilder
. Der Unterschied besteht darin, dass erstere Methoden synchronisiert haben. Wenn Sie es als lokale Variable verwenden, verwenden Sie StringBuilder
. Wenn es vorkommt, dass mehrere Threads darauf zugreifen können, verwenden Sie StringBuffer
(das ist seltener).
Hier ist ein konkretes Beispiel dafür, warum -
int total = 50000;
String s = "";
for (int i = 0; i < total; i++) { s += String.valueOf(i); }
// 4828ms
StringBuilder sb = new StringBuilder();
for (int i = 0; i < total; i++) { sb.append(String.valueOf(i)); }
// 4ms
Wie Sie sehen, ist der Leistungsunterschied erheblich.
s = sb.ToString();
am Ende angeben, damit Sie zumindest in beiden Beispielen dasselbe getan haben (Ergebnis ist a string
).
Die String-Klasse ist unveränderlich, während StringBuilder veränderbar ist.
String s = "Hello";
s = s + "World";
Der obige Code erstellt zwei Objekte, da String unveränderlich ist
StringBuilder sb = new StringBuilder("Hello");
sb.append("World");
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.
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 ).
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.:
String s1 = "something";
String s2 = "else";
String s3 = s1 + s2; // this is creating a new object.
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. :) :)
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.
Effizienz.
Jedes Mal, wenn Sie Zeichenfolgen verketten, wird eine neue Zeichenfolge erstellt. Beispielsweise:
String out = "a" + "b" + "c";
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.
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:
public class T1 {
public static void main(String[] args){
String s = "Hello";
for (int i=0;i<10;i++) {
s = s+"a";
System.out.println(s);
}
}
}
}}
Ausgabe: Es werden 10 verschiedene Zeichenfolgen anstelle von nur 1 Zeichenfolge erstellt.
Helloa
Helloaa
Helloaaa
Helloaaaa
Helloaaaaa
Helloaaaaaa
Helloaaaaaaa
Helloaaaaaaaa
Helloaaaaaaaaa
Helloaaaaaaaaaa
StringBuilder zB: Es wird nur 1 StringBuilder-Objekt erstellt.
public class T1 {
public static void main(String[] args){
StringBuilder s = new StringBuilder("Hello");
for (int i=0;i<10;i++) {
s.append("a");
System.out.println(s);
}
}
}