字符串反转核心是转为char[]后双指针原地交换:left=0、right=length-1,循环交换并缩进,最后new String(chars)返回;递归方式为reverse(s.substring(1))+s.charAt(0),栈方式则先压栈再弹出拼接。

Java 字符串反转不调用库函数(如 StringBuilder.reverse() 或 Collections.reverse()),核心思路是把字符串转为可修改的字符数组,再通过双指针从两端向中间交换字符。
1. 转成 char[] 后双指针原地交换
字符串在 Java 中是不可变的(String 是 final 类),所以必须先转为 char[] 进行修改,最后再构造新字符串返回。
这是最常用、效率高(时间 O(n),空间 O(n))且易理解的方法:
- 定义左指针
left = 0,右指针right = str.length() - 1 - 循环直到
left >= right:交换chars[left]和chars[right],然后left++、right-- - 用
new String(chars)返回结果
示例代码:
立即学习“Java免费学习笔记(深入)”;
public static String reverseString(String str) {
if (str == null || str.length() <= 1) return str;
char[] chars = str.toCharArray();
int left = 0, right = chars.length - 1;
while (left < right) {
char temp = chars[left];
chars[left] = chars[right];
chars[right] = temp;
left++;
right--;
}
return new String(chars);
}2. 递归方式(不借助额外数组,但隐式使用栈空间)
适合理解递归思想,但实际不推荐用于长字符串(有栈溢出风险)。关键在于:反转 = 当前字符 + 递归反转剩余子串的逆序结果。
- 递归终止条件:空串或单字符直接返回
- 递归拆解:
reverse(s) = reverse(s.substring(1)) + s.charAt(0) - 注意:每次
substring()都新建字符串,时间复杂度 O(n²),仅作算法练习
简洁写法(Java 8+ 可用):
public static String reverseByRecursion(String s) {
if (s == null || s.length() <= 1) return s;
return reverseByRecursion(s.substring(1)) + s.charAt(0);
}3. 使用栈模拟(显式辅助结构)
利用“后进先出”特性:先把所有字符压栈,再逐个弹出拼接。逻辑直观,但空间开销略大(O(n) 额外栈空间)。
- 遍历字符串,将每个
char推入Stack<Character> - 新建
StringBuilder(仅用于拼接,不算“调用反转库函数”)或用字符数组收集结果 - 依次
pop()并追加,最后转字符串
注意:题目要求“不调用库函数”,这里 StringBuilder.append() 属于构建工具,非反转逻辑本身,通常被接受;若严格禁止任何 StringBuilder,可用 char[] + 索引填充。
4. 避坑提醒
- 别直接操作 String:它不可变,任何“修改”都会生成新对象,无法原地反转
-
空/null 判断不能少:避免
NullPointerException或逻辑错误 - 不要用 += 拼接字符串做循环反转:因 String 不可变,每次 += 都新建对象,性能极差(O(n²))
-
Unicode 补充字符(如 emoji)需注意:普通
char是 UTF-16 单元,某些字符占两个char(代理对)。如需完整支持,应改用codePointAt()和String.offsetByCodePoints()—— 但面试中一般默认 ASCII 或简单场景,双指针 char[] 已足够


















