W3docs

Wie man einen String in Java umkehrt

Einen Java-String mit StringBuilder.reverse, Zeichenarrays, Rekursion oder Streams umkehren – mit Beispielen und Vergleich.

Einen String umzukehren bedeutet, einen neuen String zu erzeugen, dessen Zeichen in umgekehrter Reihenfolge stehen — aus "Hello" wird "olleH". Da Java-Strings unveränderlich sind, kann man einen String niemals an Ort und Stelle umkehren; man erzeugt stets einen neuen. Es gibt mehrere idiomatische Möglichkeiten, und die richtige Wahl hängt davon ab, ob man den kürzesten Code, die wenigsten Abhängigkeiten oder eine korrekte Behandlung von Zeichen außerhalb der Basic Multilingual Plane (wie Emoji) anstrebt.

Diese Seite behandelt vier Ansätze — das eingebaute StringBuilder.reverse, eine manuelle Zeichenarray-Schleife, Rekursion und eine Stream-Pipeline — vergleicht sie in einer Tabelle und führt dann alle vier mit derselben Eingabe sowie zwei Sonderfällen aus, damit man genau sehen kann, wie sie sich verhalten.

Der idiomatische Weg: StringBuilder.reverse

Die Standardbibliothek bietet bereits eine Umkehrmethode auf StringBuilder (und StringBuffer). Sie ist in fast jeder Situation die richtige Wahl:

String reversed = new StringBuilder("Hello").reverse().toString();
// reversed = "olleH"

Den ursprünglichen String in einen StringBuilder einwickeln, reverse() aufrufen und toString() aufrufen, um einen einfachen String zurückzuerhalten. Das ist schnell (ein einziger Durchlauf, kein Boxing) und gut lesbar. Ein netter Bonus: StringBuilder.reverse() ist surrogate-aware — es hält die beiden chars eines ergänzenden Codepunkts (wie ein Emoji) zusammen, anstatt sie zu vertauschen und ungültige Zeichen zu erzeugen.

Manuelle Schleife über ein Zeichenarray

Wenn man die Mechanik sehen möchte — oder sich in einer Umgebung befindet, in der StringBuilder nicht verwendet werden kann — durchläuft man ein char[] vom letzten Index bis zum ersten:

char[] chars = "Hello".toCharArray();
StringBuilder out = new StringBuilder();
for (int i = chars.length - 1; i >= 0; i--) {
  out.append(chars[i]);
}
String reversed = out.toString();

Das ist genau das, was StringBuilder.reverse intern macht, abzüglich der Surrogate-Behandlung. Man sollte das Ergebnis nicht mit reversed += chars[i] auf einem einfachen String aufbauen: String-Konkatenation in einer Schleife erzeugt bei jeder Iteration ein neues Objekt und macht aus einem O(n)-Vorgang ein O(n²)-Problem.

Rekursion und Streams

Eine rekursive Lösung liest sich wie ihre Definition — die Umkehrung eines Strings ist die Umkehrung seines Rests, gefolgt vom ersten Zeichen:

static String reverse(String s) {
  if (s.isEmpty()) return s;
  return reverse(s.substring(1)) + s.charAt(0);
}

Das ist elegant, aber es wird pro Aufruf ein Substring alloziert und der Stack kann bei sehr langen Eingaben überlaufen — daher eignet es sich eher als Lehrbeispiel als für Produktionscode. Eine Stream-basierte Einzeiler-Variante vermeidet Rekursion, ist aber die am wenigsten lesbare der vier:

String reversed = "Hello".chars()
    .mapToObj(c -> String.valueOf((char) c))
    .reduce("", (a, b) -> b + a);
AnsatzZeilenGeschwindigkeitSurrogate-sicher
StringBuilder.reverse1SchnellJa
Manuelle Zeichenarray-Schleife~5SchnellNein
Rekursion~4Langsam, Stack-begrenztNein
Stream + reduce~3Langsam (baut String neu auf)Nein

Ein ausgearbeitetes Beispiel

Dieses Programm kehrt "Hello" auf vier verschiedene Arten um, bestätigt, dass alle übereinstimmen, und prüft dann zwei Sonderfälle: einen leeren String und einen String mit einem Emoji (ein Surrogate-Paar).

java— editable, runs on the server

Was man der Ausgabe entnehmen kann:

  • Alle vier Ansätze geben olleH aus, sodass sie für einfachen ASCII-Text austauschbar sind — die Wahl zwischen ihnen betrifft Lesbarkeit und Leistung, nicht Korrektheit.
  • StringBuilder.reverse lieferte das Ergebnis in einem einzigen Ausdruck, weshalb es die Standardempfehlung gegenüber der Schleife, Rekursion und Stream-Variante ist.
  • Das Umkehren des leeren Strings gibt den leeren String zurück (''), was bestätigt, dass die Methoden ohne Längenprüfung sicher aufgerufen werden können — keine Sonderbehandlung nötig.
  • Das rekursive reverse terminierte, weil sein Basisfall (s.isEmpty()) die Kette der substring(1)-Aufrufe stoppt; ohne diesen Guard würde es niemals zurückkehren.
  • naive emoji ok: true zeigt, dass StringBuilder.reverse das lachende Emoji intakt hielt — es bewegte das Surrogate-Paar als Einheit. Eine handgeschriebene char-für-char-Schleife würde dieses Paar trennen und das Emoji korrumpieren.

Übungen

Übung
Welche eingebaute Methode kehrt einen String in einem Ausdruck um und hält dabei Surrogate-Paare (wie Emoji) intakt?
Welche eingebaute Methode kehrt einen String in einem Ausdruck um und hält dabei Surrogate-Paare (wie Emoji) intakt?

Verwandte Themen

Was this page helpful?