最高效的方式是用 StringBuilder(str).reverse().toString()。它时间复杂度为 O(n),内部直接操作字符数组,无多余对象创建,代码简洁且经过 JVM 长期优化,适合绝大多数生产场景。

为什么 StringBuilder.reverse() 最高效
• 它不生成中间字符串,避免了 String 不可变性带来的频繁内存分配
• 底层用 char[] 原地交换,没有递归调用或 Stream 流式开销
• 不依赖外部库,JDK 自带,兼容性好、无额外依赖
• 单线程下比 StringBuffer 快(后者加了同步锁)
手动实现也能高效,但需注意细节
如果出于教学、面试或特殊过滤需求(比如跳过空格),推荐双指针操作 char[]:
• 先调用 str.toCharArray() 获取副本
• 用 left 和 right 索引从两端向中间交换字符
• 最后 new String(chars) 构造结果
• 关键点:不使用 str.charAt(i) + "" 拼接,那会退化成 O(n²)
这些方法要慎用
• 递归反转:reverse(str.substring(1)) + str.charAt(0) —— 每次 substring 都新建字符串,长串易 OOM
• Stream API:函数式写法优雅,但装箱/拆箱和中间对象多,性能明显低于 StringBuilder
• 循环拼接:用 "" + c 或 += 累加字符,触发隐式 StringBuilder 扩容,效率低且不可控
回文判断别真反转
如果目标只是判断是否回文,完全不需要生成反转字符串:
• 用双指针,left 从头、right 从尾向中间走
• 跳过非字母数字字符(Character.isLetterOrDigit())
• 比较时统一转小写(Character.toLowerCase()),不新建字符串
• 时间 O(n),空间 O(1),一步到位
立即学习“Java免费学习笔记(深入)”;


















