StringBuilder.reverse()比手动循环快,因其基于数组索引原地交换、无对象创建和字符串不可变性开销;手动拼接String会产生大量中间对象加重GC,char[]手动翻转虽快但易错冗长;正确用法为new StringBuilder(s).reverse().toString(),须注意reverse()就地修改且返回StringBuilder而非String。

StringBuilder.reverse() 为什么比手动循环快
因为 StringBuilder.reverse() 是 JVM 内部用数组索引交换实现的,原地操作、无对象创建、不涉及字符串不可变性带来的拷贝开销。而手动用 for 拼接 String 会产生大量中间 String 对象,GC 压力大;用 char[] 手动翻转虽快,但代码冗长且易错。
正确调用 reverse() 的三步写法
必须注意:reverse() 是就地修改,不返回新对象,且只作用于当前 StringBuilder 实例内容——不是返回翻转后的新实例。
- 先用字符串构造
StringBuilder:new StringBuilder("hello") - 立即调用
.reverse()(它返回this,支持链式调用) - 最后用
.toString()转回String输出或使用
完整示例:
String s = "world"; String reversed = new StringBuilder(s).reverse().toString(); System.out.println(reversed); // 输出 "dlrow"
常见错误:忘记 toString() 或误判返回值类型
直接打印 new StringBuilder("abc").reverse() 看到的是类似 java.lang.StringBuilder@1b6d3586 的哈希码,因为 StringBuilder.toString() 没被显式调用。另外,有人误以为 reverse() 返回 String,实际返回的是 StringBuilder 类型,类型不匹配会导致编译失败或 IDE 报红。
- ❌ 错误:
String r = new StringBuilder("x").reverse();(类型不兼容) - ❌ 错误:
System.out.println(new StringBuilder("x").reverse());(输出地址,非内容) - ✅ 正确:
String r = new StringBuilder("x").reverse().toString();
性能边界:什么情况下不该用 reverse()
单次翻转小字符串(StringBuilder.reverse() 几乎无瓶颈;但若在高频循环中反复新建 StringBuilder,对象分配本身会有微小开销。此时可复用实例(注意线程不安全),或对超长文本考虑 CharBuffer + Array.reverse() 手动优化。
真正容易被忽略的是编码安全:如果原始字符串含代理对(surrogate pairs,如某些 emoji),StringBuilder.reverse() 会按 char 单位翻转,可能把高/低位代理拆开,导致乱码。需要 Unicode 意识时,得改用 Character.codePointAt() + StringBuilder.appendCodePoint() 方式处理。










