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 是同一个对象!

六、注意事项

  1. 线程安全reverse()synchronized 方法,多线程环境下安全。
  2. 🔄 原地修改:直接修改当前对象,不生成新对象。
  3. 🔁 可逆操作:连续调用两次 reverse() 可恢复原字符串。
  4. 📏 性能稳定:时间复杂度为 O(n),与字符串长度成正比。
  5. 🌍 Unicode 支持:正确处理多字节字符(如中文、emoji)。
  6. 🚫 无异常抛出:即使字符串为空也不会抛异常。

七、最佳实践与性能优化

✅ 最佳实践

场景 推荐做法
字符串反转 使用 new StringBuffer(str).reverse().toString()
回文判断 先比较长度,再使用 reverse 对比
大量反转操作 复用 StringBuffer 对象
单线程环境 使用 StringBuilder.reverse() 性能更高

🚀 性能优化建议

  1. 单线程优先使用 StringBuilder

    // 单线程推荐(性能更高)
    String reversed = new StringBuilder(str).reverse().toString();
    
    // 多线程才用 StringBuffer
    String reversed = new StringBuffer(str).reverse().toString();
    
  2. 复用对象减少创建开销

    StringBuffer sb = new StringBuffer(256);
    for (String s : stringArray) {
        sb.setLength(0);           // 清空
        sb.append(s).reverse();    // 反转
        process(sb.toString());
    }
    
  3. 避免不必要的反转

    // 对于回文判断,可优化为双指针法避免创建新字符串
    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;
    }
    
  4. 预设合理容量

    StringBuffer sb = new StringBuffer(1024); // 预估最大长度
    sb.append(largeText).reverse();
    

八、总结

要点 说明
✅ 核心功能 原地反转字符序列,支持所有字符类型
✅ 线程安全 synchronized 方法,多线程安全
✅ 返回值 返回 this,支持链式调用
✅ 异常 不抛出任何异常
⚠️ 注意事项 修改原对象、单线程性能较低
🚀 性能建议 单线程用 StringBuilder、复用对象、避免过度使用
💡 最佳实践 用于字符串反转、回文检测、栈模拟等场景

📌 一句话总结

StringBuffer.reverse() 是一个线程安全的字符串反转利器,适用于多线程环境下的字符序列颠倒操作。但在单线程场景中,应优先选择 StringBuilder.reverse() 以获得更优性能。记住它会修改原对象,如需保留原文本,请先复制。