ProgrammatieJava ontwikkelaar

Beschrijf de kenmerken van het werken met strings in Java, hoe String/StringBuilder/StringBuffer zijn opgebouwd, wanneer ze gebruikt moeten worden en welke valkuilen er zijn bij hun toepassing?

Slaag voor sollicitatiegesprekken met de Hintsage AI-assistent

Antwoord.

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:

  • Overtollige concatenaties van immutable strings kunnen leiden tot geheugenlekken en prestatiedaling.
  • String.intern() kan een OutOfMemoryError veroorzaken in PermGen/Metaspace bij een groot aantal unieke strings.
  • Onjuist gebruik van StringBuilder in multithreaded scenario's kan race conditions veroorzaken.

Trick vraag.

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); }

Voorbeelden van echte fouten door onbekendheid met de fijne kneepjes van het onderwerp.


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.