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. 链式调用:可与其他操作组合使用