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