0Pricing
Java Academy · Lektion

Unveränderlichkeit von String und der String-Pool

Verstehen Sie, warum Strings unveränderlich sind, wie der String-Pool funktioniert und wann Sie == bzw. equals verwenden.

Unveränderlichkeit von String und der String-Pool ist eine kostenlose Java Academy-Lektion auf CoddyKit. Dies ist Lektion 1 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des Java Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der Java Academy-Kurs umfasst insgesamt 4 Lektionen.

Unveränderlichkeit von Strings und der String-Pool

Strings sind in Java unveränderlich. Wenn Sie die Unveränderlichkeit, den String-Pool sowie Referenzgleichheit und Wertgleichheit verstehen, vermeiden Sie subtile Fehler.

Warum Strings unveränderlich sind

String-Objekte können nach ihrer Erstellung nicht verändert werden. Jede Operation, die einen String scheinbar „ändert“, erstellt tatsächlich ein neues String-Objekt. Dadurch werden gemeinsame Nutzung, Thread-Sicherheit und das Zwischenspeichern von hashCode ermöglicht.

String s = "hello";
s.toUpperCase(); // creates a new String, does NOT modify s
System.out.println(s); // still "hello"

String upper = s.toUpperCase(); // must capture the result
System.out.println(upper); // HELLO

Der String-Pool (Interning)

String-Literale werden im String-Pool (einem speziellen Bereich des Heaps) gespeichert. Zwei Literale mit demselben Inhalt verwenden dasselbe Objekt.

String a = "hello"; // goes into pool
String b = "hello"; // same object from pool
String c = new String("hello"); // forces new object outside pool

System.out.println(a == b);       // true  (same pool reference)
System.out.println(a == c);       // false (different objects)
System.out.println(a.equals(c));  // true  (same content)

== im Vergleich zu equals()

Verwenden Sie zum Vergleichen des Inhalts von Strings immer .equals(). Der Operator == prüft, ob zwei Variablen auf dasselbe Objekt verweisen (Referenzgleichheit).

String input = new String("admin"); // from user input, not pooled
String role  = "admin";

// Dangerous: fails because different objects
if (input == role) System.out.println("Same"); // not printed!

// Correct: compares content
if (input.equals(role)) System.out.println("Equal!"); // prints

// Null-safe: put constant first to avoid NPE
if ("admin".equals(input)) System.out.println("Admin"); // prints

intern(): Einen String manuell in den Pool aufnehmen

String.intern() erzwingt, dass ein String in den Pool aufgenommen wird, und gibt die Referenz auf den gepoolten String zurück. In modernem Java wird dies nur selten benötigt.

String s1 = new String("interned");
String s2 = s1.intern();
String s3 = "interned"; // already in pool

System.out.println(s2 == s3); // true (both point to pool)
System.out.println(s1 == s3); // false (s1 is off-pool)

// Modern use: prefer String.intern() only when you need
// identity-based caching with thousands of repeated strings

Verhalten bei der String-Verkettung

Eine Verkettung mit + erstellt neue String-Objekte. Innerhalb einer Schleife ist dies O(n²). Der Compiler optimiert einzelne Ausdrücke, aber keine schleifenbasierte Verkettung.

// Compiler optimizes this to a StringBuilder automatically:
String result = "Hello, " + "World" + "!";

// In loops: compiler does NOT optimize — use StringBuilder explicitly!
List<String> words = List.of("a", "b", "c", "d");
String bad = ""; // O(n^2) — new object each iteration
for (String w : words) bad += w;

StringBuilder sb = new StringBuilder();
for (String w : words) sb.append(w); // O(n) — efficient
String good = sb.toString();
System.out.println(good); // abcd

Strings richtig vergleichen

Verwenden Sie immer equals(); für einen Vergleich ohne Beachtung der Groß- und Kleinschreibung verwenden Sie equalsIgnoreCase(). compareTo() dient der lexikografischen Sortierung.

String a = "Java";
String b = "java";

System.out.println(a.equals(b));             // false
System.out.println(a.equalsIgnoreCase(b));   // true
System.out.println(a.compareToIgnoreCase(b)); // 0 (equal)
System.out.println(a.compareTo(b));           // negative (J < j in Unicode)

HashCode-Zwischenspeicherung von Strings

Da Strings unveränderlich sind, speichert Java den hashCode nach dem ersten Aufruf zwischen. Nachfolgende Aufrufe geben den zwischengespeicherten Wert zurück – dadurch eignen sich Strings besonders effizient als Schlüssel in einer HashMap.

String key = "product:12345";
// hashCode computed once and cached:
int h1 = key.hashCode();
int h2 = key.hashCode(); // returns cached value
System.out.println(h1 == h2); // true

// Strings are ideal HashMap keys because:
// 1. hashCode is consistent (immutable content)
// 2. hashCode is cached (fast repeated lookups)
// 3. equals is well-defined (content-based)
Map<String, Integer> map = new HashMap<>();
map.put("key", 42);
System.out.println(map.get("key")); // 42

String ist final

Die Klasse String ist final – sie kann nicht erweitert werden. Dadurch ist garantiert, dass keine Unterklasse die Unveränderlichkeit oder die Konsistenz von hashCode beeinträchtigen kann.

// String is final — this will not compile:
// class MutableString extends String {} // compile error

// You cannot override String behavior.
// If you need custom string-like behavior, use a wrapper:
record ProductSku(String value) {
    ProductSku { if (!value.matches("[A-Z]{3}-[0-9]{4}")) throw new IllegalArgumentException(); }
    @Override public String toString() { return value; }
}

String.format im Vergleich zur Verkettung

Bei mehrteiligen Strings sollten Sie aus Gründen der Übersichtlichkeit und einer einfacheren Lokalisierung String.format() oder Textblöcke der Verkettung vorziehen.

String name = "Alice";
int age = 30;
double score = 97.5;

// Concatenation — harder to read with many parts
String bad = "User: " + name + ", Age: " + age + ", Score: " + score;

// String.format — clear placeholders
String good = String.format("User: %s, Age: %d, Score: %.1f", name, age, score);

System.out.println(good);
// User: Alice, Age: 30, Score: 97.5

Null-sichere String-Operationen

Viele String-Operationen lösen eine NPE aus, wenn der String null ist. Verwenden Sie defensive Muster oder String.valueOf(), um null sicher zu behandeln.

String value = null;

// Null-safe length check
int len = (value != null) ? value.length() : 0;
System.out.println(len); // 0

// Null-safe comparison (put constant first)
boolean isAdmin = "admin".equals(value); // false, no NPE

// String.valueOf converts null to "null" string
System.out.println(String.valueOf(value)); // "null"
System.out.println(Objects.toString(value, "default")); // "default"

Kurzer Test

Was gibt der folgende Code aus?

String a = "hello";
String b = new String("hello");
System.out.println(a.equals(b));
System.out.println(a == b);

Zusammenfassung: Unveränderlichkeit von Strings und der String-Pool

Wichtige Erkenntnisse:

  • Strings sind unveränderlich – Operationen geben neue String-Objekte zurück und verändern niemals das ursprüngliche Objekt
  • String-Literale werden im Pool gespeichert – zwei Literale mit demselben Inhalt verwenden ein gemeinsames Objekt
  • Verwenden Sie zum Vergleichen von String-Inhalten immer .equals(); == vergleicht Objektreferenzen
  • Verwenden Sie equalsIgnoreCase() für Vergleiche ohne Beachtung der Groß- und Kleinschreibung
  • String-Verkettung in Schleifen ist O(n²) – verwenden Sie für bessere Effizienz StringBuilder
  • Strings speichern ihren hashCode zwischen – dadurch sind sie effiziente und sichere Schlüssel für HashMap

Häufig gestellte Fragen

Ist die Lektion „Unveränderlichkeit von String und der String-Pool“ kostenlos?

Ja — der vollständige Text von „Unveränderlichkeit von String und der String-Pool“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des Java Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der Java Academy-Kurs umfasst insgesamt 4 Lektionen.

Was lerne ich in „Unveränderlichkeit von String und der String-Pool“?

Verstehen Sie, warum Strings unveränderlich sind, wie der String-Pool funktioniert und wann Sie == bzw. equals verwenden. Du übst Java Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.

Brauche ich Erfahrung, um Java Academy zu starten?

Keine Vorkenntnisse erforderlich. Java Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 1 von 4.

Wie lange dauert die Lektion „Unveränderlichkeit von String und der String-Pool“?

Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.

Kann ich in dieser Java Academy-Lektion Code schreiben und ausführen?

Ja. Jede Java Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.

Alle Lektionen in diesem Kurs

  1. Unveränderlichkeit von String und der String-Pool
  2. StringBuilder für effiziente Verkettung
  3. Textblöcke und String.format
  4. Reguläre Ausdrücke mit Pattern und Matcher
← Zurück zu Java Academy