StringBuffer 提供了内置的 reverse() 方法来实现字符串反转,是处理字符串颠倒操作最简单高效的方式之一。


一、核心方法:reverse()

方法定义

public synchronized StringBuffer reverse()
  • 功能:将 StringBuffer 中的字符序列原地反转
  • 返回值:返回当前 StringBuffer 对象(支持链式调用)
  • 线程安全:synchronized 修饰,多线程安全
  • 时间复杂度:O(n),n 为字符串长度

二、基本使用方法

方法 1:直接使用 reverse()

StringBuffer sb = new StringBuffer("Hello");
sb.reverse();
System.out.println(sb.toString()); // 输出: olleH

方法 2:链式调用(一行代码完成)

String reversed = new StringBuffer("Java").reverse().toString();
System.out.println(reversed); // 输出: avaJ

方法 3:处理不同类型的数据

// 数字字符串
String numReversed = new StringBuffer("12345").reverse().toString();
System.out.println(numReversed); // 54321

// 中文字符
String cnReversed = new StringBuffer("我爱你").reverse().toString();
System.out.println(cnReversed); // 你爱我

// 混合字符
String mixed = new StringBuffer("abc123!@#").reverse().toString();
System.out.println(mixed); // #@!321cba

三、完整示例代码

示例 1:基础反转功能

public class StringBufferReverseDemo {
    public static void main(String[] args) {
        // 创建 StringBuffer
        StringBuffer original = new StringBuffer("Programming");
        
        // 反转操作
        StringBuffer reversed = original.reverse();
        
        // 输出结果
        System.out.println("原字符串: " + original.toString());
        System.out.println("反转后: " + reversed.toString());
        // 注意:original 和 reversed 是同一个对象!
    }
}
// 输出:
// 原字符串: gnimmargorP
// 反转后: gnimmargorP

示例 2:回文数判断

public static boolean isPalindrome(String str) {
    // 忽略大小写和空格的完整版本
    String cleaned = str.replaceAll("[^a-zA-Z0-9]", "").toLowerCase();
    String reversed = new StringBuffer(cleaned).reverse().toString();
    return cleaned.equals(reversed);
}

// 测试
System.out.println(isPalindrome("level"));     // true
System.out.println(isPalindrome("A man a plan a canal Panama")); // true
System.out.println(isPalindrome("hello"));     // false

示例 3:数字反转(如 123 → 321)

public static int reverseNumber(int num) {
    boolean isNegative = num < 0;
    String numStr = String.valueOf(Math.abs(num));
    String reversedStr = new StringBuffer(numStr).reverse().toString();
    int reversed = Integer.parseInt(reversedStr);
    return isNegative ? -reversed : reversed;
}

// 测试
System.out.println(reverseNumber(123));   // 321
System.out.println(reverseNumber(-456));  // -654

四、使用技巧

技巧 1:保留原字符串

String original = "Hello";
String reversed = new StringBuffer(original).reverse().toString();
// original 保持不变,reversed 为反转结果

技巧 2:部分字符串反转

StringBuffer sb = new StringBuffer("abcdef");
// 只反转中间部分:bcde → edcb
String prefix = sb.substring(0, 1);           // "a"
String suffix = sb.substring(5);              // "f"
String middle = sb.substring(1, 5);           // "bcde"
String result = prefix + new StringBuffer(middle).reverse().toString() + suffix;
System.out.println(result); // aedcbf

技巧 3:构建对称字符串

StringBuffer sb = new StringBuffer("hello");
String symmetric = sb.toString() + sb.reverse().toString();
System.out.println(symmetric); // helloolleh

五、常见错误与注意事项

错误/注意点 说明 解决方案
❌ 修改原对象 reverse() 是原地操作,会修改原始内容 如需保留原文,先复制再反转
❌ 忘记 toString() 直接打印 StringBuffer 对象 使用 .toString() 转换
⚠️ 性能考虑 单线程环境下 StringBuilder 更快 单线程优先用 StringBuilder
⚠️ 空字符串处理 空字符串反转仍为空 无需特殊处理,方法能正确处理
// 错误示范
StringBuffer sb = new StringBuffer("test");
String reversed = sb.reverse(); // 类型错误!

// 正确做法
String reversed = sb.reverse().toString();

六、性能优化建议

  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());
        sb.reverse();              // 恢复原状(可选)
    }
    
  3. 避免在循环中频繁反转

    // 如果需要多次反转,考虑缓存结果
    

七、与其他反转方法对比

方法 优点 缺点 适用场景
StringBuffer.reverse() 线程安全、简单易用 单线程性能较低 多线程环境
StringBuilder.reverse() 性能最好 非线程安全 单线程环境
手动循环 完全控制逻辑 代码复杂 特殊反转需求
Collections.reverse() 可处理字符列表 需要转换开销 已有 List 结构

八、总结

✅ StringBuffer 实现字符串反转的核心要点:

  1. 使用 reverse() 方法:最简单直接的方式
  2. 线程安全:适合多线程环境下的字符串反转
  3. 原地修改:会改变原始对象内容,如需保留原文请先复制
  4. 支持所有字符:正确处理中文、数字、符号等
  5. 链式调用:可与其他操作组合使用