1. 简介

在本篇文章中,我们将介绍如何在 Java 的 String 对象中指定位置插入一个字符

我们会展示三种实现方式,每种都提供一个函数:接收原始字符串、要插入的字符以及插入位置,最终返回插入字符后的新字符串。

由于 String 类是 final 且不可变 的,因此我们不能直接修改原字符串,只能返回一个新的字符串对象。

2. 使用字符数组(Character Array)

这种方式比较底层,思路是:

  • 创建一个新的字符数组,长度比原字符串多 1;
  • 将原字符串中插入位置之前的字符复制到新数组;
  • 在指定位置插入新字符;
  • 再将原字符串中插入位置之后的字符依次复制到新数组中;
  • 最后通过字符数组构造新的字符串。
public String addChar(String str, char ch, int position) {
    int len = str.length();
    char[] updatedArr = new char[len + 1];
    str.getChars(0, position, updatedArr, 0);
    updatedArr[position] = ch;
    str.getChars(position, len, updatedArr, position + 1);
    return new String(updatedArr);
}

优点:性能最优,控制力最强
缺点:代码略复杂,可读性一般

这种方式适合对性能有极致要求的场景,比如高频调用或大数据量处理。

3. 使用 substring() 方法

这是一种更高级、更直观的实现方式。我们可以利用 String 类的 substring() 方法将原字符串拆成两部分,再将新字符插入中间并拼接。

public String addChar(String str, char ch, int position) {
    return str.substring(0, position) + ch + str.substring(position);
}

优点:代码简洁易懂
缺点:性能较差,会创建多个临时对象

由于 String 是不可变类,每次调用 substring() 都会创建新的字符串对象。再加上字符串拼接时,编译器还会自动使用 StringBuilder 来处理,导致:

  • 多次内存分配;
  • 多次字符复制;
  • 堆内存中可能产生大量临时对象,频繁触发 GC。

⚠️ 如果需要高频调用该方法,这种实现方式可能会带来性能瓶颈

4. 使用 StringBuilder

StringBuilder 是 Java 提供的用于高效构建和修改字符串的工具类。我们可以使用其 insert() 方法轻松实现在指定位置插入字符的功能。

public String addChar(String str, char ch, int position) {
    StringBuilder sb = new StringBuilder(str);
    sb.insert(position, ch);
    return sb.toString();
}

优点:代码简洁、可读性强、性能稳定
缺点:性能略逊于字符数组方式

虽然 StringBuilder 内部也需要移动字符,但它的内存管理更合理,不会像 substring() 那样频繁创建临时对象。

推荐在大多数场景下使用这种方式,因为它兼顾了代码可读性和执行效率。

5. 总结

在这篇文章中,我们探讨了在 Java 中向字符串指定位置插入字符的三种实现方式:

方法 性能 可读性 适用场景
字符数组 ✅ 最高 ❌ 一般 高频调用、性能敏感场景
substring() ❌ 较差 ✅ 高 偶尔使用、代码简洁优先
StringBuilder ✅ 良好 ✅ 高 绝大多数情况下的首选方案

推荐使用 StringBuilderinsert() 方法,它在性能、可读性和稳定性之间取得了良好的平衡。

本文完整代码示例已上传至 GitHub:https://github.com/eugenp/tutorials/tree/master/core-java-modules/core-java-string-algorithms-2


原始标题:Add a Character to a String at a Given Position