字符串反转是 Java 开发中常见的基础操作(如密码脱敏、文本处理、算法题等场景),不同实现方法对应不同的学习价值和使用场景。下面从 “最简单的工具类法” 到 “底层手动实现法”,逐一讲解核心思路和代码示例。
StringBuilder(非线程安全)和StringBuffer(线程安全)是 Java 提供的可变字符串类,内置的reverse()方法是实现字符串反转最简洁、高效的方式,也是实际开发中的首选。
public class StringReverseDemo {public static void main(String[] args) {
- 核心逻辑:
reverse()方法会直接修改字符数组的顺序(底层是交换字符数组的首尾元素),时间复杂度O(n)(n 为字符串长度),效率极高;
- 选型建议:单线程场景用
StringBuilder(无同步锁,效率更高),多线程场景用StringBuffer(加了同步锁,保证线程安全);
- 注意点:必须先校验字符串是否为
null或空,避免空指针异常(NPE)。
该方法通过将字符串转为字符数组,手动交换 “首字符” 和 “尾字符”,直到遍历到数组中间位置,适合理解字符串反转的底层原理。
public class StringReverseDemo {public static void main(String[] args) {String original = "Hello Java";if (original == null || original.isEmpty()) {System.out.println("输入字符串不能为空");return;}
- 核心逻辑:双指针法(左指针从 0 开始,右指针从末尾开始),每次交换两个指针指向的字符,直到
left >= right;
- 学习价值:理解字符串的底层存储(Java 字符串本质是字符数组),掌握双指针的基础用法;
- 效率:时间复杂度
O(n),空间复杂度O(n)(需创建字符数组),与reverse()方法效率接近。
递归的核心是 “将大问题拆解为小问题”:每次取字符串的最后一个字符,拼接在剩余子串反转结果的前面,直到子串为空。
public class StringReverseDemo {public static void main(String[] args) {String original = "Hello Java";if (original == null || original.isEmpty()) {System.out.println("输入字符串不能为空");return;}
- 递归终止条件:字符串长度≤1 时,无需反转,直接返回;
- 优缺点:代码简洁、易理解递归思想,但递归会创建大量栈帧,字符串过长时可能导致
StackOverflowError(栈溢出),实际开发中不推荐用于长字符串;
- 时间 / 空间复杂度:时间复杂度
O(n),空间复杂度O(n)(栈空间开销)。
利用 Java 8 的 Stream 流和 Lambda 表达式实现反转,适合熟悉函数式编程的场景,代码更简洁、优雅。
import java.util.stream.Collectors;public class StringReverseDemo {public static void main(String[] args) {String original = "Hello Java";if (original == null || original.isEmpty()) {System.out.println("输入字符串不能为空");return;}
- 核心逻辑:将字符串转为字符流,收集为列表后逆序,再拼接成字符串;
- 适用场景:适合结合其他 Stream 操作(如过滤、映射)的场景,单独反转字符串时不如
StringBuilder高效;
- 注意点:需导入
java.util.stream.Collectors包。
- 推荐方法:实际开发优先使用
StringBuilder.reverse()(单线程)或StringBuffer.reverse()(多线程),简洁、高效、无坑;
- 学习方法:手动遍历字符数组(双指针)适合理解底层逻辑,递归适合学习递归思想,但均不推荐作为生产环境首选;
- 避坑要点:无论哪种方法,都必须先校验字符串是否为
null/ 空,避免空指针异常;递归反转长字符串易栈溢出,需谨慎使用。