Was ist der Hauptunterschied zwischen StringBuffer
y StringBuilder
? Gibt es irgendwelche Leistungsprobleme, wenn man sich für eines dieser Produkte entscheidet?
Antworten
Zu viele Anzeigen?StringBuffer
synchronisiert ist, StringBuilder
ist nicht.
StringBuilder
ist schneller als StringBuffer
denn es ist nicht synchronized
.
Hier ist ein einfacher Benchmark-Test:
public class Main {
public static void main(String[] args) {
int N = 77777777;
long t;
{
StringBuffer sb = new StringBuffer();
t = System.currentTimeMillis();
for (int i = N; i --> 0 ;) {
sb.append("");
}
System.out.println(System.currentTimeMillis() - t);
}
{
StringBuilder sb = new StringBuilder();
t = System.currentTimeMillis();
for (int i = N; i > 0 ; i--) {
sb.append("");
}
System.out.println(System.currentTimeMillis() - t);
}
}
}
A Testlauf gibt die Nummern von 2241 ms
für StringBuffer
gegen 753 ms
für StringBuilder
.
Im Grunde genommen, StringBuffer
Methoden synchronisiert werden, während StringBuilder
sind es nicht.
Die Vorgänge sind "fast" die gleichen, aber die Verwendung synchronisierter Methoden in einem einzigen Thread ist ein Overkill.
Das war's dann auch schon.
Zitat von StringBuilder API :
Diese Klasse [StringBuilder] bietet eine mit StringBuffer kompatible API, aber ohne Garantie der Synchronisation . Diese Klasse ist als Ersatz für StringBuffer gedacht, wenn der String-Buffer von einem einzigen Thread verwendet wird (was im Allgemeinen der Fall ist). Wo es möglich ist, wird empfohlen, dass diese Klasse anstelle von StringBuffer verwendet wird, da wird es bei den meisten Implementierungen schneller sein.
Deshalb wurde er als Ersatz angefertigt.
Dasselbe geschah mit Vector
y ArrayList
.
Aber um den Unterschied anhand eines Beispiels deutlich zu machen?
StringBuffer oder StringBuilder
Verwenden Sie einfach StringBuilder
es sei denn, Sie versuchen wirklich, einen Puffer zwischen Threads zu teilen. StringBuilder
ist der unsynchronisierte (weniger Overhead = effizienter) jüngere Bruder des ursprünglichen synchronisierten StringBuffer
Klasse.
StringBuffer
kam zuerst. Sun war auf Korrektheit unter allen Bedingungen bedacht, also wurde es synchronisiert, um es für alle Fälle thread-sicher zu machen.
StringBuilder
kamen später. Die meisten der Verwendungen von StringBuffer
waren Single-Thread und zahlten unnötigerweise die Kosten für die Synchronisierung.
Desde StringBuilder
は Ausfallersatz für StringBuffer
Ohne die Synchronisierung gäbe es keine Unterschiede zwischen den Beispielen.
Si vous sont zwischen Threads zu teilen, können Sie mit StringBuffer
aber überlegen Sie, ob eine Synchronisierung auf höherer Ebene erforderlich ist, z. B. sollten Sie vielleicht statt StringBuffer die Methoden synchronisieren, die den StringBuilder verwenden.
Sehen wir uns zunächst die Ähnlichkeiten : Sowohl StringBuilder als auch StringBuffer sind veränderbar. Das bedeutet, dass Sie den Inhalt von ihnen ändern können, mit in der gleichen Stelle.
Unterschiede : StringBuffer ist veränderbar und auch synchronisiert. StringBuilder ist zwar veränderbar, aber standardmäßig nicht synchronisiert.
Bedeutung von synchronisiert (Synchronisation) : Wenn etwas synchronisiert ist, können mehrere Threads darauf zugreifen und es ohne Probleme oder Nebeneffekte ändern. StringBuffer ist synchronisiert, so dass Sie es mit mehreren Threads ohne jedes Problem verwenden können.
Welcher ist wann zu verwenden? StringBuilder : Wenn Sie eine veränderbare Zeichenkette benötigen, auf die nur ein Thread zugreift und sie verändert. StringBuffer : Wenn Sie eine veränderbare Zeichenkette benötigen und mehrere Threads auf sie zugreifen und sie verändern.
Hinweis : Verwenden Sie StringBuffer nicht unnötig, d.h. verwenden Sie ihn nicht, wenn nur ein Thread ihn ändert und darauf zugreift, da er viel Sperr- und Freigabecode für die Synchronisierung enthält, der unnötig CPU-Zeit in Anspruch nimmt. Verwenden Sie keine Sperren, wenn es nicht erforderlich ist.
- See previous answers
- Weitere Antworten anzeigen