StringBuffer.insert()StringBuffer 类中用于在指定位置插入数据的核心方法,允许在字符串序列的任意位置插入各种类型的数据,实现灵活的字符串构建与修改。


一、方法定义

public synchronized StringBuffer insert(int offset, boolean b)
public synchronized StringBuffer insert(int offset, char c)
public synchronized StringBuffer insert(int offset, char[] str)
public synchronized StringBuffer insert(int offset, double d)
public synchronized StringBuffer insert(int offset, float f)
public synchronized StringBuffer insert(int offset, int i)
public synchronized StringBuffer insert(int offset, long l)
public synchronized StringBuffer insert(int offset, Object obj)
public synchronized StringBuffer insert(int offset, String str)
// 还有其他重载形式,如插入 char[] 的子数组等

返回值:返回当前 StringBuffer 对象引用(支持链式调用)
修饰符synchronized 表示线程安全
参数说明

  • offset:插入位置的索引(从 0 开始)
  • 后续参数为要插入的各种数据类型

二、功能说明

  • StringBuffer 中指定索引 offset 处插入指定的数据。
  • 原始位置及其后的字符向后移动,为新内容腾出空间。
  • 支持所有基本数据类型、StringObject
  • 插入后,length() 增加,capacity() 可能自动扩容。

⚠️ 插入位置规则

  • offset == length():插入到末尾(等效于 append
  • offset == 0:插入到开头
  • 0 < offset < length():插入到中间

三、示例代码

示例 1:插入字符串

StringBuffer sb = new StringBuffer("HelloWorld");
sb.insert(5, " ");
System.out.println(sb.toString()); // 输出: Hello World

示例 2:插入数字

StringBuffer sb = new StringBuffer("Year: ");
sb.insert(6, 2025);
System.out.println(sb.toString()); // 输出: Year: 2025

示例 3:插入布尔值

StringBuffer sb = new StringBuffer("Active: ");
sb.insert(8, true);
System.out.println(sb.toString()); // 输出: Active: true

示例 4:插入字符

StringBuffer sb = new StringBuffer("ac");
sb.insert(1, 'b');
System.out.println(sb.toString()); // 输出: abc

示例 5:链式调用

StringBuffer sb = new StringBuffer("World");
sb.insert(0, "Hello ").insert(6, ", ").insert(sb.length(), "!");
System.out.println(sb.toString()); // 输出: Hello, World!

四、使用技巧

技巧 1:在开头插入(前缀添加)

sb.insert(0, "Prefix: ");

技巧 2:在末尾插入(等效 append)

sb.insert(sb.length(), "Suffix");

技巧 3:格式化插入(构建结构化文本)

StringBuffer sql = new StringBuffer("SELECT * FROM users");
sql.insert(15, " name, age "); // 修改字段

技巧 4:动态插入变量

StringBuffer sb = new StringBuffer("欢迎光临,");
sb.insert(sb.length() - 1, userName); // 在“,”前插入用户名
sb.append("!");

五、常见错误

错误 代码示例 异常
索引为负数 sb.insert(-1, "x") StringIndexOutOfBoundsException
索引超出长度 sb.insert(100, "x")(当前长度<100) StringIndexOutOfBoundsException
插入 null 字符串 sb.insert(0, (String)null) NullPointerException

❗ 注意:插入 null 对象也会抛出异常:

sb.insert(0, (Object)null); // 抛出 NullPointerException

六、注意事项

  1. 线程安全insert()synchronized 方法,多线程安全。
  2. 🔁 自动扩容:若插入后超出当前容量,会自动扩容(原容量×2+2)。
  3. 📏 索引范围:合法范围是 0 <= offset <= length()
  4. 🧹 性能影响:在中间插入需移动后续字符,时间复杂度为 O(n)。
  5. 🚫 避免 null:不要插入 null 值,应先判断或使用默认值。

七、最佳实践与性能优化

✅ 最佳实践

场景 推荐做法
添加前缀 使用 insert(0, ...)
构建模板字符串 预留位置再插入变量
多次插入 使用链式调用提升可读性
插入大量数据 预设足够容量

🚀 性能优化建议

  1. 预设容量避免频繁扩容

    // 推荐:预估最终长度
    StringBuffer sb = new StringBuffer(512);
    sb.insert(0, "Header");
    
  2. 避免在循环中频繁 insert 中间位置

    // ❌ 低效:每次插入都移动大量数据
    StringBuffer sb = new StringBuffer();
    for (int i = 0; i < 1000; i++) {
        sb.insert(0, i); // 每次都在开头插入,性能极差
    }
    
    // ✅ 高效:先 append 再 reverse
    StringBuffer sb = new StringBuffer();
    for (int i = 0; i < 1000; i++) {
        sb.append(i);
    }
    sb.reverse();
    
  3. 优先使用 append() 替代末尾 insert()

    // 推荐
    sb.append("text");
    
    // 不推荐(功能相同但语义不清)
    sb.insert(sb.length(), "text");
    
  4. 复用 StringBuffer 对象

    StringBuffer sb = new StringBuffer(256);
    for (int i = 0; i < 100; i++) {
        sb.setLength(0); // 清空重用
        sb.insert(0, "Item: ").append(i);
        System.out.println(sb);
    }
    

八、总结

要点 说明
✅ 核心功能 在指定位置插入数据,支持所有基本类型
✅ 线程安全 所有 insert 方法均为 synchronized
✅ 索引范围 0 <= offset <= length()
✅ 返回值 返回 this,支持链式调用
⚠️ 常见错误 索引越界、插入 null
🚀 性能建议 预设容量、避免中间高频插入、单线程考虑 StringBuilder
💡 最佳实践 链式调用、合理使用 insert 与 append、及时清理

📌 一句话总结

StringBuffer.insert() 是构建和修改字符串的强大工具,适用于多线程环境下的灵活插入操作,但需注意索引边界、避免 null 值,并通过预设容量和合理设计提升性能。单线程场景建议优先使用 StringBuilder.insert() 以获得更高性能。