Unterschied zwischen StringBuilder, StringBuffer und String in Java
Wo liegt der Unterschied und wann verwende ich am besten die Klassen StringBuilder, StringBuffer und String in Java.
Wo liegt der Unterschied und wann verwende ich am besten die Klassen StringBuilder, StringBuffer und String in Java.
Der Unterschied zwischen String, StringBuilder und StringBuffer in Java liegt in ihrer "immutability" (VerÀnderbarkeit) und Thread-Sicherheit.
String: Strings in Java sind unverÀnderlich (immutable), d.h. ihr Wert kann nicht geÀndert werden, sobald sie erstellt wurden. Das macht ihre Verwendung in Multi-Thread-Umgebungen sicher, kann aber in Bezug auf die Speichernutzung weniger effizient sein, da jedes Mal, wenn Sie eine Zeichenkette Àndern, ein neues String-Objekt erstellt wird.
StringBuilder: StringBuilder ist eine verĂ€nderbare Version von String, die fĂŒr die Verwendung in Single-Thread-Umgebungen konzipiert ist (also nicht thread-safe!). Er bietet Methoden zum AnhĂ€ngen, EinfĂŒgen oder Löschen von Zeichen aus einer Zeichenkette, so dass Sie Zeichenketten dynamisch erstellen können. StringBuilder ist fĂŒr Single-Thread-Anwendungen schneller als StringBuffer, da er nicht synchronisiert ist.
StringBuffer: StringBuffer ist Ă€hnlich wie StringBuilder, aber es ist thread-safe, so dass es geeignet fĂŒr den Einsatz in Multi-Thread-Umgebungen. StringBuffer bietet Methoden zum AnhĂ€ngen, EinfĂŒgen oder Löschen von Zeichen aus einer Zeichenkette, genau wie StringBuilder, aber es ist langsamer als StringBuilder aufgrund des Overheads fĂŒr die Synchronisation.
Noch ein Beispiel fĂŒr StringBuilder vs. StringBuffer beim Zugriff aus mehreren Threads:
public class StringBuilderVsStringBuffer {
private static StringBuilder builder = new StringBuilder();
private static StringBuffer buffer = new StringBuffer();
public static void main(String[] args) {
// Hier wird einfach
Runnable runnable = () -> {
for (int i = 0; i < 1000; i++) {
builder.append("s");
buffer.append("s");
}
};
Thread thread1 = new Thread(runnable);
Thread thread2 = new Thread(runnable);
thread1.start();
thread2.start();
try {
thread1.join();
thread2.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("StringBuilder LĂ€nge: " + builder.length()); // unvorhersehbar
System.out.println("StringBuffer LĂ€nge: " + buffer.length()); // immer 2000
}
}
In diesem Beispiel haben wir zwei Threads, die gleichzeitig den Buchstaben "s" an ein StringBuilder- und ein StringBuffer-Objekt anhÀngen. Da StringBuffer thread-safe ist, können wir erwarten, dass der sich in einer Multi-Thread-Umgebung korrekt verhÀlt (die LÀnge des StringBuffer-Objekts immer 2000 betrÀgt - 1000 jeweils von jedem Thread). Beim StringBuilder können die beiden Therads das Objekt gleichzeitig verÀndern, deswegen können wir am Ende die LÀnge nicht vorhersagen.