StringBuffer.reverse()
是 StringBuffer
类中用于反转字符序列的核心方法,能够将字符串缓冲区中的字符顺序完全颠倒,是处理字符串反转需求的高效工具。
一、方法定义
public synchronized StringBuffer reverse()
✅ 返回值:返回当前
StringBuffer
对象引用(支持链式调用)
✅ 修饰符:synchronized
表示线程安全
✅ 参数:无
✅ 异常:不抛出任何异常
二、功能说明
- 将
StringBuffer
中的字符序列原地反转(in-place reversal)。 - 原字符串的第一个字符变为最后一个,最后一个变为第一个,依此类推。
- 支持中文、数字、符号、Unicode 字符的正确反转。
- 反转后,
length()
不变,但字符顺序完全改变。 - 该方法修改的是原始对象,不会创建新对象。
🔄 反转规则:
"abc"
→"cba"
"你好"
→"好你"
"123!@#"
→"#@!321"
三、示例代码
示例 1:基本字符串反转
StringBuffer sb = new StringBuffer("Hello");
sb.reverse();
System.out.println(sb.toString()); // 输出: olleH
示例 2:数字字符串反转
StringBuffer sb = new StringBuffer("12345");
sb.reverse();
System.out.println(sb.toString()); // 输出: 54321
示例 3:中文字符反转
StringBuffer sb = new StringBuffer("我爱你");
sb.reverse();
System.out.println(sb.toString()); // 输出: 你爱我
示例 4:混合字符反转
StringBuffer sb = new StringBuffer("Java2025!");
sb.reverse();
System.out.println(sb.toString()); // 输出: !5202avaJ
示例 5:链式调用
StringBuffer sb = new StringBuffer("desserts");
String result = sb.reverse().insert(0, "stressed -> ").toString();
System.out.println(result); // 输出: stressed -> stressed
示例 6:回文判断(经典应用)
public static boolean isPalindrome(String str) {
StringBuffer sb = new StringBuffer(str);
return str.equals(sb.reverse().toString());
}
// 测试
System.out.println(isPalindrome("level")); // true
System.out.println(isPalindrome("hello")); // false
四、使用技巧
技巧 1:快速实现字符串反转
String reversed = new StringBuffer(original).reverse().toString();
技巧 2:数字反转(如 123 → 321)
int num = 123;
String reversed = new StringBuffer(String.valueOf(num)).reverse().toString();
int reversedNum = Integer.parseInt(reversed);
技巧 3:栈式操作模拟
// 模拟栈的后进先出
StringBuffer sb = new StringBuffer();
sb.append("first").append("second").append("third");
sb.reverse(); // 变成 "drihtdnocsdnif",可用于逆序处理
技巧 4:与 insert/append 配合构建对称字符串
StringBuffer sb = new StringBuffer("abc");
StringBuffer temp = new StringBuffer(sb);
String symmetric = sb.append(temp.reverse()).toString();
// 结果: "abccba"
五、常见错误
错误 | 说明 | 解决方案 |
---|---|---|
忘记调用 toString() |
直接打印 StringBuffer 对象 | 使用 .toString() 转换 |
误认为创建新对象 | reverse() 修改原对象 |
如需保留原字符串,应先复制 |
在单线程中过度使用 | 性能略低于 StringBuilder | 单线程优先用 StringBuilder |
❗ 错误示例:
StringBuffer sb = new StringBuffer("abc"); StringBuffer reversed = sb.reverse(); // reversed 和 sb 是同一个对象!
六、注意事项
- ✅ 线程安全:
reverse()
是synchronized
方法,多线程环境下安全。 - 🔄 原地修改:直接修改当前对象,不生成新对象。
- 🔁 可逆操作:连续调用两次
reverse()
可恢复原字符串。 - 📏 性能稳定:时间复杂度为 O(n),与字符串长度成正比。
- 🌍 Unicode 支持:正确处理多字节字符(如中文、emoji)。
- 🚫 无异常抛出:即使字符串为空也不会抛异常。
七、最佳实践与性能优化
✅ 最佳实践
场景 | 推荐做法 |
---|---|
字符串反转 | 使用 new StringBuffer(str).reverse().toString() |
回文判断 | 先比较长度,再使用 reverse 对比 |
大量反转操作 | 复用 StringBuffer 对象 |
单线程环境 | 使用 StringBuilder.reverse() 性能更高 |
🚀 性能优化建议
单线程优先使用
StringBuilder
// 单线程推荐(性能更高) String reversed = new StringBuilder(str).reverse().toString(); // 多线程才用 StringBuffer String reversed = new StringBuffer(str).reverse().toString();
复用对象减少创建开销
StringBuffer sb = new StringBuffer(256); for (String s : stringArray) { sb.setLength(0); // 清空 sb.append(s).reverse(); // 反转 process(sb.toString()); }
避免不必要的反转
// 对于回文判断,可优化为双指针法避免创建新字符串 public static boolean isPalindromeOptimized(String s) { int left = 0, right = s.length() - 1; while (left < right) { if (s.charAt(left++) != s.charAt(right--)) return false; } return true; }
预设合理容量
StringBuffer sb = new StringBuffer(1024); // 预估最大长度 sb.append(largeText).reverse();
八、总结
要点 | 说明 |
---|---|
✅ 核心功能 | 原地反转字符序列,支持所有字符类型 |
✅ 线程安全 | synchronized 方法,多线程安全 |
✅ 返回值 | 返回 this ,支持链式调用 |
✅ 异常 | 不抛出任何异常 |
⚠️ 注意事项 | 修改原对象、单线程性能较低 |
🚀 性能建议 | 单线程用 StringBuilder 、复用对象、避免过度使用 |
💡 最佳实践 | 用于字符串反转、回文检测、栈模拟等场景 |
📌 一句话总结:
StringBuffer.reverse()
是一个线程安全的字符串反转利器,适用于多线程环境下的字符序列颠倒操作。但在单线程场景中,应优先选择StringBuilder.reverse()
以获得更优性能。记住它会修改原对象,如需保留原文本,请先复制。