字串反轉是面試與日常開發常見課題。本文介紹 Java 中 5 種主流實作方式,附完整代碼與測試結果。
public String reverseByArray(String str) {
if (str == null || str.length() <= 1) return str;
char[] ch = str.toCharArray();
for (int i = 0; i < ch.length / 2; i++) {
char temp = ch[i];
ch[i] = ch[ch.length - i - 1];
ch[ch.length - i - 1] = temp;
}
return new String(ch);
}
原地交換,空間複雜度 O(n),時間複雜度 O(n/2),效能極佳。
public String reverseByStack(String str) {
if (str == null || str.length() <= 1) return str;
Stack stack = new Stack<>();
for (char c : str.toCharArray()) stack.push(c);
char[] ch = str.toCharArray();
for (int i = 0; i < ch.length; i++) ch[i] = stack.pop();
return new String(ch);
}
利用堆疊 LIFO 特性,代碼直觀但額外空間開銷較大。
public String reverseByBuilder(String str) {
if (str == null || str.length() <= 1) return str;
StringBuilder sb = new StringBuilder();
for (int i = str.length() - 1; i >= 0; i--) sb.append(str.charAt(i));
return sb.toString();
}
最常見寫法,StringBuilder 非線程安全、效能優於 StringBuffer。
public String reverseByBit(String str) {
if (str == null || str.length() <= 1) return str;
char[] ch = str.toCharArray();
int len = str.length();
for (int i = 0; i < len / 2; i++) {
ch[i] ^= ch[len - 1 - i];
ch[len - 1 - i] ^= ch[i];
ch[i] ^= ch[len - 1 - i];
}
return new String(ch);
}
無需暫存變數的交換技巧,屬於「秀技巧」類,實務較少用。
public String reverseByRecursive(String str) {
if (str == null || str.length() == 0) return str;
if (str.length() == 1) return str;
return reverseByRecursive(str.substring(1)) + str.charAt(0);
}
優雅但效能最差:大量字串拼接與遞歸呼叫,易導致堆疊溢位,不建議生產環境使用。
public class Reverse {
private final String str;
public Reverse(String str) { this.str = str; }
// 上述 5 個方法...
public static void main(String[] args) {
String s = "123456";
Reverse r = new Reverse(s);
System.out.println(r.reverseByArray());
System.out.println(r.reverseByStack());
System.out.println(r.reverseByBuilder());
System.out.println(r.reverseByBit());
System.out.println(r.reverseByRecursive(s));
}
}

StringBuilder 逆序遍歷),代碼簡潔、效能優、可讀性高。