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();
六、性能优化建议
单线程环境使用
StringBuilder
// 推荐(单线程) String reversed = new StringBuilder(str).reverse().toString(); // 多线程才用 StringBuffer String reversed = new StringBuffer(str).reverse().toString();
复用对象减少创建开销
StringBuffer sb = new StringBuffer(256); for (String s : stringArray) { sb.setLength(0); // 清空 sb.append(s).reverse(); // 反转 process(sb.toString()); sb.reverse(); // 恢复原状(可选) }
避免在循环中频繁反转
// 如果需要多次反转,考虑缓存结果
七、与其他反转方法对比
方法 | 优点 | 缺点 | 适用场景 |
---|---|---|---|
StringBuffer.reverse() |
线程安全、简单易用 | 单线程性能较低 | 多线程环境 |
StringBuilder.reverse() |
性能最好 | 非线程安全 | 单线程环境 |
手动循环 | 完全控制逻辑 | 代码复杂 | 特殊反转需求 |
Collections.reverse() |
可处理字符列表 | 需要转换开销 | 已有 List 结构 |
八、总结
✅ StringBuffer
实现字符串反转的核心要点:
- 使用
reverse()
方法:最简单直接的方式 - 线程安全:适合多线程环境下的字符串反转
- 原地修改:会改变原始对象内容,如需保留原文请先复制
- 支持所有字符:正确处理中文、数字、符号等
- 链式调用:可与其他操作组合使用