一、方法定义
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()
可能导致数据错乱。
六、注意事项
- 原地修改:
reverse()
直接修改原对象内容,不会创建新对象。 - 返回自身:返回
this
,可用于链式调用。 - Unicode 支持:正确处理 Unicode 字符(如中文、emoji)。
- 空值安全:空字符串或单字符反转无副作用。
- 线程不安全:多线程环境下需同步控制或使用
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()
方法,能让你在处理字符串反转、回文判断、逆序构建等任务时更加得心应手。