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:
- 位置前原String的子串
- 新角色
- 位置后原String的子串
public String addChar(String str, char ch, int position) {
return str.substring(0, position) + ch + str.substring(position);
}
虽然上面的代码更具可读性,**但它有一个缺点,它创建了许多临时对象来确定结果。**由于 String是一个不可变的类,每次调用它的substring()方法都会创建一个新的String实例。
最后,当我们连接这些部分时,编译器会创建一个StringBuilder对象来逐个附加它们。每个String和StringBuilder对象都为其内部字符数组分配单独的内存位置。
此实现还需要将所有字符从一个数组复制三次到另一个数组。
如果我们需要大量调用该方法,临时对象可能会填满堆内存,这将非常频繁地触发 GC。这也会在一定程度上影响性能。
4. 使用StringBuilder
StringBuilder是Java库提供的一个实用类,用于以多种方式构造和操作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可能会更慢,但它没有初始化临时对象的内存负担。我们还得到了简单易读的代码。