In Java ist die Klasse String immutable (unveränderlich): Bei jeder Veränderungsoperation wird ein neues Objekt erstellt. Die Klassen StringBuilder und StringBuffer sind veränderlich und werden für Verkettungen in Schleifen und komplexe Umwandlungen verwendet.
Wesentliche Unterschiede:
String: immutable, thread-sicher ohne zusätzliche Synchronisierung. Ideal für lesbaren, unveränderlichen Text (z. B. Schlüssel, Nachrichten).StringBuilder: mutable, nicht thread-sicher, jedoch schnelle Verkettung. Wird dort verwendet, wo Strings oft verändert werden.StringBuffer: mutable, thread-sicher (Methoden sind synchronisiert), aber in der Leistung unterlegen im Vergleich zu StringBuilder.Beispiel für einen Geschwindigkeitsvergleich:
String s = ""; for (int i = 0; i < 10000; i++) { s += i; // erzeugt jedes Mal einen neuen String, langsam! } // Besser so: StringBuilder sb = new StringBuilder(); for (int i = 0; i < 10000; i++) { sb.append(i); } String result = sb.toString();
Fallstricke:
String.intern() kann bei einer großen Anzahl einzigartiger Strings einen OutOfMemoryError in PermGen/Metaspace verursachen.Frage: "Ist die Verkettung von Strings mit dem Operator "+" innerhalb einer Schleife effizient?"
Antwort: Nein, jedes Mal wird ein neues String-Objekt erstellt, was den Speicher und den GC stark belastet. Für viele Operationen ist es besser, StringBuilder oder StringBuffer (wenn Thread-Sicherheit erforderlich ist) zu verwenden.
Beispiel:
String s = ""; for (int i = 0; i < 1000; i++) { s += i; // SEHR ineffizient! } // vs StringBuilder sb = new StringBuilder(); for (int i = 0; i < 1000; i++) { sb.append(i); }
Geschichte
In einem Bankprojekt verlangsamte die Verkettung von Strings mit dem Operator "+" in einer großen Schleife die nightly-Analytik um das 15-fache. Das Problem wurde durch den Wechsel zu StringBuilder gelöst, die Ausführungszeit verkürzte sich von 40 Minuten auf 2.
Geschichte
Ein junger Entwickler machte einen Fehler mit Threads und verwendete StringBuilder im selben Objekt-Facade, auf das mehrere Threads gleichzeitig zugriffen. Dies führte zu zufälligen Fehlern und falschen Ergebnissen aufgrund fehlender Synchronisation.
Geschichte
In einem Projekt wurden einzigartige Tags mit String.intern() erstellt. Als die Benutzerzahl auf mehrere Millionen anstieg, begann die JVM, OutOfMemoryError: PermGen space auszulösen. Man beschloss, auf die Verwendung von intern() zu verzichten und auf andere Caching-Mechanismen umzusteigen.