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)

最佳实践

  1. 常规场景:优先使用 setLength()(最高效)

    // 复用缓冲区模板
    StringBuffer buffer = new StringBuffer();
    while (hasData()) {
        buffer.append(getData());
        process(buffer);
        buffer.setLength(buffer.length() - 1); // 移除末尾分隔符
    }
    
  2. 需要精确控制删除位置:使用 deleteCharAt()

    // 删除特定位置的无效字符
    if (isInvalidChar(buffer.charAt(buffer.length()-1))) {
        buffer.deleteCharAt(buffer.length()-1);
    }
    
  3. 多字符清理:使用 delete()

    // 删除末尾多个字符
    buffer.delete(buffer.length()-3, buffer.length());
    

注意事项

  1. 空缓冲区处理

    // 安全写法
    public static void removeLastChar(StringBuffer sb) {
        if (sb == null || sb.length() == 0) return;
        sb.setLength(sb.length() - 1);
    }
    
  2. Unicode 代理对

    // 处理表情符号等特殊字符(占2个char)
    StringBuffer emoji = new StringBuffer("😊");
    emoji.setLength(emoji.length() - 1); // 破坏性操作!
    System.out.println(emoji); // 输出乱码 "?"
    
  3. 多线程环境

    // 使用同步块保证线程安全
    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()(安全清晰)
  • 关键路径代码 → 始终检查长度避免异常