Java - 字符串反转
Java 字符串反转:4 种实用方法(附完整实例)
字符串反转是 Java 开发中常见的基础操作(如密码脱敏、文本处理、算法题等场景),不同实现方法对应不同的学习价值和使用场景。下面从 “最简单的工具类法” 到 “底层手动实现法”,逐一讲解核心思路和代码示例。
一、方法 1:使用 StringBuilder/StringBuffer 的 reverse ()(推荐)
StringBuilder(非线程安全)和StringBuffer(线程安全)是 Java 提供的可变字符串类,内置的reverse()方法是实现字符串反转最简洁、高效的方式,也是实际开发中的首选。完整代码示例
public class StringReverseDemo {public static void main(String[] args) {// 原始字符串String original = "Hello Java";// 空值/空字符串校验(实际开发必备)if (original == null || original.isEmpty()) {System.out.println("输入字符串不能为空");return;}// 方法1:StringBuilder(非线程安全,效率更高)StringBuilder sb = new StringBuilder(original);String reversed1 = sb.reverse().toString();System.out.println("StringBuilder反转结果:" + reversed1); // 输出:avaJ olleH// 方法1变体:StringBuffer(线程安全,适合多线程场景)StringBuffer sbf = new StringBuffer(original);String reversed2 = sbf.reverse().toString();System.out.println("StringBuffer反转结果:" + reversed2); // 输出:avaJ olleH}
}
关键说明
- 核心逻辑:
reverse()方法会直接修改字符数组的顺序(底层是交换字符数组的首尾元素),时间复杂度O(n)(n 为字符串长度),效率极高; - 选型建议:单线程场景用
StringBuilder(无同步锁,效率更高),多线程场景用StringBuffer(加了同步锁,保证线程安全); - 注意点:必须先校验字符串是否为
null或空,避免空指针异常(NPE)。
二、方法 2:手动遍历字符数组(理解底层逻辑)
该方法通过将字符串转为字符数组,手动交换 “首字符” 和 “尾字符”,直到遍历到数组中间位置,适合理解字符串反转的底层原理。
完整代码示例
public class StringReverseDemo {public static void main(String[] args) {String original = "Hello Java";if (original == null || original.isEmpty()) {System.out.println("输入字符串不能为空");return;}// 方法2:手动遍历字符数组char[] charArray = original.toCharArray();int left = 0; // 左指针(起始位置)int right = charArray.length - 1; // 右指针(末尾位置)// 交换首尾字符,直到指针相遇while (left < right) {// 临时变量保存左指针字符char temp = charArray[left];// 交换左右指针字符charArray[left] = charArray[right];charArray[right] = temp;// 左指针右移,右指针左移left++;right--;}// 字符数组转回字符串String reversed = new String(charArray);System.out.println("手动遍历反转结果:" + reversed); // 输出:avaJ olleH}
}
关键说明
- 核心逻辑:双指针法(左指针从 0 开始,右指针从末尾开始),每次交换两个指针指向的字符,直到
left >= right; - 学习价值:理解字符串的底层存储(Java 字符串本质是字符数组),掌握双指针的基础用法;
- 效率:时间复杂度
O(n),空间复杂度O(n)(需创建字符数组),与reverse()方法效率接近。
三、方法 3:递归实现(理解递归思想)
递归的核心是 “将大问题拆解为小问题”:每次取字符串的最后一个字符,拼接在剩余子串反转结果的前面,直到子串为空。
完整代码示例
public class StringReverseDemo {public static void main(String[] args) {String original = "Hello Java";if (original == null || original.isEmpty()) {System.out.println("输入字符串不能为空");return;}// 方法3:递归反转String reversed = reverseByRecursion(original);System.out.println("递归反转结果:" + reversed); // 输出:avaJ olleH}// 递归方法private static String reverseByRecursion(String str) {// 递归终止条件:字符串长度≤1时,直接返回自身if (str.length() <= 1) {return str;}// 拆解:最后一个字符 + 剩余子串的反转结果char lastChar = str.charAt(str.length() - 1);String remaining = str.substring(0, str.length() - 1);return lastChar + reverseByRecursion(remaining);}
}
关键说明
- 递归终止条件:字符串长度≤1 时,无需反转,直接返回;
- 优缺点:代码简洁、易理解递归思想,但递归会创建大量栈帧,字符串过长时可能导致
StackOverflowError(栈溢出),实际开发中不推荐用于长字符串; - 时间 / 空间复杂度:时间复杂度
O(n),空间复杂度O(n)(栈空间开销)。
四、方法 4:Java 8 Stream 流(进阶,函数式编程)
利用 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;}// 方法4:Stream流反转String reversed = original.chars() // 转为IntStream(每个元素是字符的ASCII码).mapToObj(c -> String.valueOf((char) c)) // 转为字符字符串.collect(Collectors.toList()) // 收集为List.stream().sorted((a, b) -> -1) // 逆序排序.collect(Collectors.joining()); // 拼接为字符串System.out.println("Stream流反转结果:" + reversed); // 输出:avaJ olleH}
}
关键说明
- 核心逻辑:将字符串转为字符流,收集为列表后逆序,再拼接成字符串;
- 适用场景:适合结合其他 Stream 操作(如过滤、映射)的场景,单独反转字符串时不如
StringBuilder高效; - 注意点:需导入
java.util.stream.Collectors包。
总结
关键点回顾
- 推荐方法:实际开发优先使用
StringBuilder.reverse()(单线程)或StringBuffer.reverse()(多线程),简洁、高效、无坑; - 学习方法:手动遍历字符数组(双指针)适合理解底层逻辑,递归适合学习递归思想,但均不推荐作为生产环境首选;
- 避坑要点:无论哪种方法,都必须先校验字符串是否为
null/ 空,避免空指针异常;递归反转长字符串易栈溢出,需谨慎使用。
相关新闻
2025年度口碑佳橡胶垫厂家考量及性价比高橡胶垫供应商推荐 - 工业推荐榜
2026/8/28 13:39:19
查看详情
揭秘AI Agent部署难题:5大常见坑点与避坑策略
2026/8/28 13:39:20
查看详情
132_尚硅谷_Go字符串函数详解(1)
2026/8/27 23:51:54
查看详情
SpringMVC后端跨域问题解决
2026/8/28 13:39:16
查看详情
技术博客创作指南:从技术概念到可复现实践
2026/8/28 13:39:16
查看详情
【hana】hana2.0多容器常用命令
2026/8/28 13:38:45
查看详情
南京Python培训成本解析:从学费到价值,如何选择适合的课程
2026/8/28 13:38:13
查看详情
模型评估实战:从混淆矩阵到ROC/KS曲线,精准量化分类模型性能
2026/8/28 13:38:13
查看详情
SpringMVC后端跨域问题解决
2026/8/28 13:39:16
查看详情
技术博客创作指南:从技术概念到可复现实践
2026/8/28 13:39:16
查看详情
【hana】hana2.0多容器常用命令
2026/8/28 13:38:45
查看详情
南京Python培训成本解析:从学费到价值,如何选择适合的课程
2026/8/28 13:38:13
查看详情
模型评估实战:从混淆矩阵到ROC/KS曲线,精准量化分类模型性能
2026/8/28 13:38:13
查看详情
2026学术工具专业测评|Paperxie全维度性能实测报告[特殊字符]
2026/8/28 0:00:38
查看详情
iPhone照片打不开或无法上传?手把手教你heic格式转化png的完整流程
2026/8/28 0:01:48
查看详情
从软件测试大赛到实战:Java+Selenium自动化测试进阶指南
2026/8/28 0:02:19
查看详情
[光学原理与应用-521]:对光的错误理解与纠偏
2026/8/28 8:18:27
查看详情
GetQzonehistory:QQ空间数据备份完整指南
2026/8/28 5:37:08
查看详情
如何把 .pck 里的资源全部拆出来:Godot 解包工具的三步用法与两种模式
2026/8/28 7:30:04
查看详情
飞书AI团队协作效能评估报告(2024Q2独家数据):TOP10企业已启用「AI协作健康度」仪表盘
2026/8/27 14:42:04
查看详情
当AI成为你的专属音乐制作人:SongGeneration如何重塑创作边界
2026/8/27 10:03:27
查看详情
回收苹果手机哪个平台靠谱?从资质到报价全维度测评 - 甄选测评馆
2026/8/27 18:48:45
查看详情