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)