In Java is de klasse String immutable (onveranderlijk): bij elke wijziging wordt een nieuw object aangemaakt. De klassen StringBuilder en StringBuffer zijn veranderlijk en worden gebruikt voor concatenatie binnen lussen en complexe transformaties.
Belangrijkste verschillen:
String: immutable, thread-safe zonder extra synchronisatie. Ideaal voor leesbare, onveranderlijke tekst (bijvoorbeeld sleutels, berichten).StringBuilder: mutable, niet thread-safe, maar snelle concatenatie. Wordt gebruikt waar strings vaak worden gewijzigd.StringBuffer: mutable, thread-safe (methoden zijn gesynchroniseerd), maar is minder efficiënt dan StringBuilder.Voorbeeld van snelheid vergelijking:
String s = ""; for (int i = 0; i < 10000; i++) { s += i; // elke keer een nieuwe String aanmaken, langzaam! } // Beter zo: StringBuilder sb = new StringBuilder(); for (int i = 0; i < 10000; i++) { sb.append(i); } String result = sb.toString();
Valkuilen:
String.intern() kan een OutOfMemoryError veroorzaken in PermGen/Metaspace bij een groot aantal unieke strings.Vraag: "Is het effectief om strings te concatenëren met de operator "+" binnen een lus?"
Antwoord: Nee, bij elke keer wordt er een nieuw String-object aangemaakt, wat een zware belasting voor het geheugen en de GC met zich meebrengt. Voor veel bewerkingen is het beter om StringBuilder of StringBuffer te gebruiken (als thread safety vereist is).
Voorbeeld:
String s = ""; for (int i = 0; i < 1000; i++) { s += i; // HEEL ondoeltreffend! } // versus StringBuilder sb = new StringBuilder(); for (int i = 0; i < 1000; i++) { sb.append(i); }
Verhaal
In een bankproject vertraagde het concatenëren van strings met de operator "+" in een grote lus de nightly-analyse met 15 keer. Het probleem werd opgelost door over te schakelen op StringBuilder, de uitvoeringstijd ging van 40 minuten naar 2.
Verhaal
Een jonge ontwikkelaar maakte een fout met threads en gebruikte StringBuilder in hetzelfde façade-object, dat gelijktijdig door meerdere threads werd aangeroepen. Dit leidde tot willekeurige bugs en onjuiste resultaten door gebrek aan synchronisatie.
Verhaal
In een project werden unieke labels gemaakt met behulp van String.intern(). Bij een groei van gebruikers tot tientallen miljoenen begon de JVM OutOfMemoryError: PermGen space te gooien. We besloten om geen gebruik meer te maken van intern() en over te schakelen op andere cachingmechanismen.