Java StringBuffer
去除最后一个字符的 4 种方法
方法 1:使用 setLength()
(高效截断)
StringBuffer sb = new StringBuffer("Hello!");
if (sb.length() > 0) {
sb.setLength(sb.length() - 1); // 直接修改长度
}
System.out.println(sb); // 输出 "Hello"
优点:效率最高(O(1) 时间复杂度)
注意:需先检查长度避免 IndexOutOfBoundsException
方法 2:使用 deleteCharAt()
(精确删除)
StringBuffer sb = new StringBuffer("Hello!");
if (sb.length() > 0) {
sb.deleteCharAt(sb.length() - 1); // 删除指定位置字符
}
System.out.println(sb); // 输出 "Hello"
优点:语义清晰,直接定位删除
适用场景:需要删除特定位置字符时
方法 3:使用 delete()
(区间删除)
StringBuffer sb = new StringBuffer("Hello!");
int len = sb.length();
if (len > 0) {
sb.delete(len - 1, len); // 删除 [start, end) 区间
}
System.out.println(sb); // 输出 "Hello"
优点:可扩展用于删除连续字符
性能:与 deleteCharAt()
相当(O(n) 但 n=1)
方法 4:使用 substring()
(不修改原对象)
StringBuffer sb = new StringBuffer("Hello!");
String result = (sb.length() > 0)
? sb.substring(0, sb.length() - 1)
: "";
System.out.println(result); // 输出 "Hello"
特点:创建新字符串,原 StringBuffer
不变
适用场景:需要保留原缓冲区内容时
性能对比与最佳实践
方法 | 时间复杂度 | 是否修改原对象 | 推荐指数 |
---|---|---|---|
setLength()-1 |
O(1) | 是 | ⭐⭐⭐⭐⭐ |
deleteCharAt() |
O(n)* | 是 | ⭐⭐⭐⭐ |
delete(len-1,len) |
O(n)* | 是 | ⭐⭐⭐ |
substring() |
O(n) | 否 | ⭐⭐ |
*注:当仅删除1个字符时,实际复杂度接近 O(1)
最佳实践:
常规场景:优先使用
setLength()
(最高效)// 复用缓冲区模板 StringBuffer buffer = new StringBuffer(); while (hasData()) { buffer.append(getData()); process(buffer); buffer.setLength(buffer.length() - 1); // 移除末尾分隔符 }
需要精确控制删除位置:使用
deleteCharAt()
// 删除特定位置的无效字符 if (isInvalidChar(buffer.charAt(buffer.length()-1))) { buffer.deleteCharAt(buffer.length()-1); }
多字符清理:使用
delete()
// 删除末尾多个字符 buffer.delete(buffer.length()-3, buffer.length());
注意事项
空缓冲区处理:
// 安全写法 public static void removeLastChar(StringBuffer sb) { if (sb == null || sb.length() == 0) return; sb.setLength(sb.length() - 1); }
Unicode 代理对:
// 处理表情符号等特殊字符(占2个char) StringBuffer emoji = new StringBuffer("😊"); emoji.setLength(emoji.length() - 1); // 破坏性操作! System.out.println(emoji); // 输出乱码 "?"
多线程环境:
// 使用同步块保证线程安全 synchronized(buffer) { if (buffer.length() > 0) { buffer.setLength(buffer.length() - 1); } }
总结
场景 | 推荐方法 | 代码示例 |
---|---|---|
高效移除末尾字符 | setLength(-1) |
sb.setLength(sb.length()-1) |
需要删除特定位置字符 | deleteCharAt() |
sb.deleteCharAt(sb.length()-1) |
批量删除末尾字符 | delete() |
sb.delete(sb.length()-N, sb.length()) |
保留原缓冲区创建新字符串 | substring() |
sb.substring(0, sb.length()-1) |
终极建议:
- 单线程环境 →
StringBuilder
+setLength()
(性能最优) - 多线程环境 →
StringBuffer
+deleteCharAt()
(安全清晰) - 关键路径代码 → 始终检查长度避免异常