How to Reverse a String in Java

The idiomatic one-liner to reverse a String in Java is new StringBuilder(s).reverse().toString(). It correctly handles Unicode surrogate pairs, unlike a naive char-by-char loop.

StringBuilder.reverse() β€” recommended

String original = "Hello, Java!";
String reversed = new StringBuilder(original).reverse().toString();
System.out.println(reversed); // !avaJ ,olleH

StringBuilder.reverse() is implemented in the JDK and handles supplementary (4-byte) Unicode characters correctly by treating surrogate pairs as a unit.

Manual loop

public static String reverse(String s) {
    char[] chars = s.toCharArray();
    int left = 0, right = chars.length - 1;
    while (left < right) {
        char tmp = chars[left];
        chars[left]  = chars[right];
        chars[right] = tmp;
        left++;
        right--;
    }
    return new String(chars);
}

System.out.println(reverse("Java")); // avaJ

This in-place char swap is fast but does not handle surrogate pairs (some emoji and rare Unicode characters occupy two char slots). Use StringBuilder.reverse() for correctness.

Streams β€” functional style

String s = "Hello";
String reversed = s.chars()
    .mapToObj(c -> String.valueOf((char) c))
    .collect(Collectors.collectingAndThen(
        Collectors.joining(),
        sb -> new StringBuilder(sb).reverse().toString()
    ));
// Simpler: just use StringBuilder directly β€” the stream version is not cleaner here

Recursive approach (educational, not practical)

public static String reverse(String s) {
    if (s.isEmpty()) return s;
    return reverse(s.substring(1)) + s.charAt(0);
}
// "Java" β†’ reverse("ava") + "J" β†’ ... β†’ "avaJ"

The recursive version is elegant but O(nΒ²) due to string concatenation and O(n) stack depth. Use it to illustrate recursion, not in production.

Reverse words in a sentence

String sentence = "Hello World Java";
String reversed = new StringBuilder(sentence).reverse().toString();
// "avaJ dlroW olleH" β€” reverses all characters

// Reverse word order (not characters within words):
String[] words = sentence.split(" ");
Collections.reverse(Arrays.asList(words));
String wordReversed = String.join(" ", words);
System.out.println(wordReversed); // "Java World Hello"

Check if a string is a palindrome

public static boolean isPalindrome(String s) {
    String clean = s.toLowerCase().replaceAll("[^a-z0-9]", "");
    return clean.equals(new StringBuilder(clean).reverse().toString());
}

isPalindrome("racecar");         // true
isPalindrome("A man a plan a canal Panama"); // true (after cleaning)