1.2. Strings
Strings in Java sind unveränderlich (immutable). Das bedeutet, sobald ein String-Objekt erstellt wurde, kann dessen Inhalt nicht mehr verändert werden. Jede Operation, die scheinbar einen String verändert, erzeugt tatsächlich ein neues String-Objekt.
Strings dürfen in Java nicht mit == oder != verglichen werden, da hierbei nur geprüft wird, ob beide Referenzen auf das gleiche Objekt zeigen. Um die inhaltliche Gleichheit zu prüfen, ist die Methode .equals() zu verwenden:
String a = "Hallo";
String b = new String("Hallo");
// Nicht empfohlen:
if (a == b) { ... } // Vergleicht Referenzen, nicht Inhalte!
// Empfohlen:
if (a.equals(b)) { ... } // Vergleicht Inhalte!
String-Literale werden in Java automatisch in einem sogenannten String-Pool gespeichert. Dieser Pool sorgt dafür, dass identische String-Literale nur einmal im Speicher existieren. Dadurch verweisen mehrere Variablen, die dasselbe String-Literal verwenden, auf dasselbe Objekt im Speicher.
Die explizite Verwendung der Methode intern() ist möglich, um dynamisch erzeugte Strings in diesen Pool aufzunehmen. Diese Methode ist allerdings nur in spezifischen Szenarien zur Speicheroptimierung relevant.
+ und concat erzeugen jedes Mal ein neues Objekt. In Schleifen ist deshalb StringBuilder die passende Wahl:
StringBuilder sb = new StringBuilder();
for (int i = 0; i < namen.size(); i++) {
if (i > 0) {
sb.append(", ");
}
sb.append(namen.get(i));
}
String liste = sb.toString();
Seit Java 15 gibt es formatted() als Alternative zu String.format. Mehrzeilige Literale (Text Blocks) sind ab Java 15 final – Beispiele stehen unter Java 17.
isBlank(), strip(), lines() und repeat() gehören zur String-API ab Java 11. Details und Beispiele stehen auf der Java-11-Seite.