Was ein String ist
Ein String enthält eine Folge von Zeichen - Text wie ein Name, ein Satz oder eine aus einer Datei gelesene Zeile. Auf der vorigen Seite hast du String unter den Referenztypen aufgeführt gesehen; hier arbeitest du nun tatsächlich mit einem. Ein String-Literal schreibst du mit doppelten Anführungszeichen (einfache Anführungszeichen sind für ein einzelnes char reserviert):
name.length() gibt die Anzahl der Zeichen zurück - 3 für "Ada". Es ist ein Methodenaufruf, daher braucht es die Klammern.
Strings verbinden
Der +-Operator klebt Strings aneinander. Wenn eine der beiden Seiten von + ein String ist, wird die andere Seite automatisch in Text umgewandelt, sodass du ohne zusätzlichen Aufwand Zahlen und Booleans einmischen kannst:
Ein Fallstrick: Da + von links nach rechts ausgewertet wird, ergibt "" + 1 + 2 den Wert "12" (String + int, dann String + int), aber 1 + 2 + "" ergibt "3" (die beiden Ganzzahlen werden zuerst addiert und dann in Text umgewandelt). Im Zweifelsfall setzt du die Arithmetik in Klammern.
Strings sind unveränderlich
Das ist das Wichtigste, was man über Java-Strings verstehen muss: Ein String ändert sich nach seiner Erstellung nie. Jede Methode, die einen String „verändert", gibt in Wirklichkeit einen brandneuen String zurück und lässt das Original unberührt. Wenn du also vergisst, den Rückgabewert zu erfassen, passiert nichts:
Der erste Aufruf berechnet "HELLO" und verwirft es sofort. Nur die zweite Zeile, die wieder in s zuweist, hat einen sichtbaren Effekt. In diese Falle tappt fast jeder einmal.
Strings vergleichen
Verwende .equals(), um den Inhalt zweier Strings zu vergleichen. Zu == zu greifen ist der klassische Anfängerfehler: == fragt „sind das dasselbe Objekt im Speicher?", nicht „enthalten sie denselben Text?":
a == b ist hier false, weil new String(...) ein separates Objekt erzwingt. Vergleiche String-Werte immer mit .equals() (oder .equalsIgnoreCase(), um Groß- und Kleinschreibung zu ignorieren). Ein praktischer Trick, um einen Absturz zu vermeiden, wenn eine Seite null sein könnte, ist, .equals auf dem Literal aufzurufen: "yes".equals(input) wirft nie eine Exception, selbst wenn input gleich null ist.
Alltägliche String-Methoden
Da Strings unveränderlich sind, gibt jede dieser Methoden einen neuen String (oder einen Wert) zurück, anstatt das Original zu ändern. Das sind die, zu denen du ständig greifen wirst:
Beachte die Verkettung: s.trim().toUpperCase() funktioniert, weil trim() einen String zurückgibt, auf dem du dann toUpperCase() aufrufst. substring ist ein weiteres Arbeitspferd - es nimmt einen Startindex (inklusive) und einen optionalen Endindex (exklusive):
Die Indizes sind nullbasiert, also greift substring(0, 4) die Zeichen 0 bis 3. Einen Index jenseits des Endes anzufordern, wirft eine StringIndexOutOfBoundsException.
Strings in einer Schleife aufbauen
Das Verketten mit + ist für ein paar Teile in Ordnung, aber innerhalb einer großen Schleife ist es langsam - jedes + erzeugt einen neuen String und kopiert alles. Wenn du Text in einer Schleife zusammensetzt, verwende StringBuilder, der einen Puffer an Ort und Stelle verändert und am Ende den fertigen String genau einmal erzeugt:
append gibt denselben Builder zurück, sodass sich die Aufrufe verketten lassen. Rufe am Ende .toString() auf, um einen normalen String zu erhalten. Für einmalige Zusammenfügungen bleib bei +; um viele Teile anzusammeln, ist StringBuilder das richtige Werkzeug.
Weiter: String-Formatierung
Verketten wird unübersichtlich, sobald du ausgerichtete Spalten, feste Nachkommastellen oder aufgefüllte Zahlen brauchst. Javas String.format und printf verwenden eine Vorlage mit %-Platzhaltern, um all das sauber zu erledigen - das ist Thema der nächsten Seite.
Häufig gestellte Fragen
Wie vergleicht man zwei Strings in Java?
Verwende .equals() für den Inhalt: a.equals(b) gibt true zurück, wenn die Zeichen übereinstimmen. Verwende nicht ==, um String-Werte zu vergleichen - == vergleicht Objektreferenzen und kann daher false für zwei Strings zurückgeben, die denselben Text enthalten. Verwende .equalsIgnoreCase(), wenn Groß- und Kleinschreibung keine Rolle spielen soll.
Warum sind Java-Strings unveränderlich (immutable)?
Einmal erstellt, kann ein String-Objekt sich nie mehr ändern. Methoden wie replace oder toUpperCase geben einen neuen String zurück, anstatt das Original zu verändern. Die Unveränderlichkeit macht Strings sicher zum Teilen und Zwischenspeichern, bedeutet aber, dass du das Ergebnis zuweisen musst: s = s.toUpperCase();. Wenn du eine Methode aufrufst und ihren Rückgabewert ignorierst, passiert nichts.
Wie ermittelt man die Länge eines Strings in Java?
Rufe die Methode .length() auf: "hello".length() gibt 5 zurück. Beachte, dass es bei einem String eine Methode mit Klammern ist - anders als bei Arrays, wo length ein Feld ohne Klammern ist (arr.length).