一、方法定义

public StringBuilder reverse()

参数:

  • 无参数

返回值:

  • 返回当前 StringBuilder 对象本身(支持链式调用)

二、功能说明

reverse() 方法用于StringBuilder 中的字符序列进行反转,即首尾字符互换位置,原地修改字符串内容。

核心功能

  • 将字符串内容逆序排列
  • 原地修改,不创建新对象
  • 支持链式调用(返回 this
  • 时间复杂度:O(n),其中 n 是字符长度

三、示例代码

1. 基本使用

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

2. 数字字符串反转

StringBuilder sb = new StringBuilder("12345");
sb.reverse();
System.out.println(sb); // 输出: 54321

3. 回文判断(辅助)

public static boolean isPalindrome(String str) {
    StringBuilder sb = new StringBuilder(str);
    return str.equals(sb.reverse().toString());
}

System.out.println(isPalindrome("racecar")); // true
System.out.println(isPalindrome("hello"));   // false

4. 链式调用

StringBuilder sb = new StringBuilder("Java")
    .append(" is ")
    .append("cool")
    .reverse();

System.out.println(sb); // 输出: looc si avaJ

5. 空字符串或单字符

StringBuilder empty = new StringBuilder("");
empty.reverse();
System.out.println("Empty: '" + empty + "'"); // 输出: Empty: ''

StringBuilder single = new StringBuilder("A");
single.reverse();
System.out.println(single); // 输出: A

四、使用技巧

1. 快速反转字符串

替代手动循环,简洁高效。

// 快速反转任意字符串
String reversed = new StringBuilder(original).reverse().toString();

2. 结合 insert() 实现逆序构建

避免在开头频繁插入。

// ❌ 低效方式
StringBuilder bad = new StringBuilder();
for (char c : "hello".toCharArray()) {
    bad.insert(0, c); // 每次都移动
}

// ✅ 高效方式:末尾追加 + reverse()
StringBuilder good = new StringBuilder();
for (char c : "hello".toCharArray()) {
    good.append(c);
}
good.reverse(); // 一次性反转

3. 数字反转(用于算法题)

// 反转整数(不考虑溢出)
int reverseInt(int x) {
    StringBuilder sb = new StringBuilder(String.valueOf(x));
    return Integer.parseInt(sb.reverse().toString());
}

五、常见错误

1. 忘记调用 toString()

StringBuilder sb = new StringBuilder("abc");
// 错误:直接打印 StringBuilder 对象
// System.out.println(sb.reverse()); // 虽然能打印,但若赋值给 String 会出错

// 正确:转换为 String
String result = sb.reverse().toString();

2. 误解 reverse() 返回新对象

StringBuilder sb1 = new StringBuilder("abc");
StringBuilder sb2 = sb1.reverse(); // 返回的是同一个对象引用

System.out.println(sb1 == sb2); // true:是同一个对象

3. 在多线程中共享使用

StringBuilder 非线程安全,多线程同时调用 reverse() 可能导致数据错乱。


六、注意事项

  1. 原地修改reverse() 直接修改原对象内容,不会创建新对象。
  2. 返回自身:返回 this,可用于链式调用。
  3. Unicode 支持:正确处理 Unicode 字符(如中文、emoji)。
  4. 空值安全:空字符串或单字符反转无副作用。
  5. 线程不安全:多线程环境下需同步控制或使用 StringBuffer.reverse()

Unicode 示例:

StringBuilder sb = new StringBuilder("你好");
sb.reverse();
System.out.println(sb); // 输出: 好你(正确反转)

七、最佳实践与性能优化

✅ 最佳实践

场景 推荐做法
反转字符串 使用 new StringBuilder(str).reverse().toString()
构建逆序字符串 优先 append() + reverse(),避免 insert(0, ...)
频繁反转 考虑是否逻辑可优化,减少调用次数
多线程环境 使用 StringBuffer.reverse() 或加锁

⚠️ 性能提示

  • reverse() 时间复杂度为 O(n),性能良好
  • 避免在循环中频繁反转大字符串
  • 若只需判断回文,可使用双指针法避免创建对象:
// 更高效的回文判断(无需 StringBuilder)
public static boolean isPalindrome(String s) {
    int left = 0, right = s.length() - 1;
    while (left < right) {
        if (s.charAt(left++) != s.charAt(right--)) return false;
    }
    return true;
}

八、总结

StringBuilder.reverse() 是一个简洁高效的字符串反转工具,适用于大多数反转场景。

核心要点:

项目 说明
功能 原地反转字符序列
返回值 返回 this,支持链式调用
性能 O(n) 时间复杂度,性能良好
线程安全 否,多线程慎用
null 安全 不接受 null,但空字符串安全
Unicode 正确支持

使用口诀:

反转就用 reverse,原地修改效率高;
链式调用很方便,末尾追加再反转妙;
多线程里要小心,StringBuffer 是备胎;
回文判断双指针,性能更优记得牢。

掌握 reverse() 方法,能让你在处理字符串反转、回文判断、逆序构建等任务时更加得心应手。