EMZETT.
Login

Strings

Kurz: Der Datentyp für Text in Java — technisch ein Objekt (kein primitiver Typ), aber mit Sonderbehandlung, die die Nutzung fast wie bei einem primitiven Typ wirken lässt.

Genauer: String-Objekte sind unveränderlich (immutable): jede scheinbare Änderung (z. B. .toUpperCase()) erzeugt in Wirklichkeit ein neues Objekt, das ursprüngliche bleibt unverändert. Wegen des sogenannten “String Pools” kann == bei zwei gleich geschriebenen String-Literalen zwar zufällig true liefern — für einen verlässlichen Inhaltsvergleich gehört trotzdem immer .equals() genutzt.

Im Detail

String a = "Hallo";
String b = "Hallo";
String c = new String("Hallo");
 
System.out.println(a == b);        // true - beide Literale zeigen auf denselben Pool-Eintrag
System.out.println(a == c);        // false - new String() erzwingt ein eigenes Objekt
System.out.println(a.equals(c));   // true - Inhalt ist identisch
 
String upper = a.toUpperCase();    // erzeugt NEUES Objekt, "a" selbst bleibt "Hallo"
System.out.println(a);             // immer noch "Hallo"

Java-Strings sind aus zwei Gründen speziell: Erstens landen String-Literale (in Anführungszeichen direkt im Code geschrieben) automatisch im sogenannten String Pool, einem gemeinsamen Speicherbereich — zwei gleich geschriebene Literale zeigen deshalb intern auf dasselbe Objekt, weshalb == (das Objektidentität, nicht Inhalt vergleicht) hier scheinbar zuverlässig true liefert. Mit new String(...) erzwungene Objekte umgehen den Pool bewusst und liefern bei == false, obwohl der Inhalt identisch ist — genau deshalb ist == bei Strings ein Antipattern, .equals() gehört immer verwendet.

Zweitens sind Strings unveränderlich (immutable): jede Methode, die scheinbar den String “ändert” (.toUpperCase(), .replace(), .substring() usw.), gibt in Wirklichkeit ein KOMPLETT NEUES String-Objekt zurück, das Original bleibt unangetastet. Das macht Strings automatisch thread-sicher (kein anderer Thread kann sie nachträglich verändern) und ermöglicht den String Pool überhaupt erst — wären Strings veränderlich, könnte eine Änderung an einer Referenz unerwartet alle anderen Stellen im Programm beeinflussen, die dasselbe Pool-Objekt nutzen.

Siehe auch: String Concatenation, Special Characters, Non-primitive Types