Contents

Java中在String对象中添加字符

1. 简介

在这个快速教程中,我们将演示如何在Java中的String的任何给定位置添加字符。

我们将展示一个简单函数的三个实现,它接受原始*字符串、*一个字符和我们需要添加它的位置。

由于 String 类是最终的且不可变 的,因此该函数应返回一个带有添加字符的新String

2. 使用字符数组

这里的想法是创建一个新的字符数组并从给定位置之前的原始String中复制字符。

之后,我们将新字符放在该位置,并将原始String中的其余字符复制到新数组的后续位置。

最后,我们从该数组构造所需的String

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()方法。它通过连接准备String

  1. 位置前原String的子串
  2. 新角色
  3. 位置后原String的子串
public String addChar(String str, char ch, int position) {
    return str.substring(0, position) + ch + str.substring(position);
}

虽然上面的代码更具可读性,**但它有一个缺点,它创建了许多临时对象来确定结果。**由于 String是一个不可变的类,每次调用它的substring()方法都会创建一个新的String实例。

最后,当我们连接这些部分时,编译器会创建一个StringBuilder对象来逐个附加它们。每个StringStringBuilder对象都为其内部字符数组分配单独的内存位置。

此实现还需要将所有字符从一个数组复制三次到另一个数组。

如果我们需要大量调用该方法,临时对象可能会填满堆内存,这将非常频繁地触发 GC。这也会在一定程度上影响性能。

4. 使用StringBuilder

StringBuilderJava库提供的一个实用类,用于以多种方式构造和操作String对象。 我们可以使用StringBuilder类的*insert()*方法实现相同的功能:

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

上面的代码只需要创建一个StringBuilder对象就可以在该位置插入字符。它分配与原始String相同的内存量,但为了为新字符创建一个位置,底层数组将下一个字符移动 1 个位置。

尽管使用StringBuilder可能会更慢,但它没有初始化临时对象的内存负担。我们还得到了简单易读的代码。