1732 Stimmen

Unterschied zwischen StringBuilder und StringBuffer

Was ist der Hauptunterschied zwischen StringBuffer y StringBuilder ? Gibt es irgendwelche Leistungsprobleme, wenn man sich für eines dieser Produkte entscheidet?

1775voto

sblundy Punkte 59298

StringBuffer synchronisiert ist, StringBuilder ist nicht.

761voto

polygenelubricants Punkte 362173

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 .

267voto

OscarRyz Punkte 189898

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 .

194voto

Bert F Punkte 81431

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 StringBuilderAusfallersatz 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.

88voto

user1923551 Punkte 4506

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.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X