指定された位置で文字列に文字を追加する
1. 序章
このクイックチュートリアルでは、で、Javaの文字列の任意の位置に文字を追加する方法を示します。
元のString、文字、およびそれを追加する必要のある位置を取得する単純な関数の3つの実装を示します。
Stringクラスはfinalで不変であるため、関数は文字が追加された新しい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);
}
他の2つの方法と比較すると、これは低レベルの設計アプローチであり、最も柔軟性があります。
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 は不変のクラスであるため、を呼び出すたびに[ X203X] substring()メソッドは、新しいStringインスタンスを作成します。
最後に、パーツを連結すると、コンパイラーは、パーツを1つずつ追加するためのStringBuilderオブジェクトを作成します。 すべてのStringおよびStringBuilderオブジェクトは、内部文字配列に個別のメモリ位置を割り当てます。
この実装では、すべての文字を1つの配列から別の配列に3回コピーする必要もあります。
メソッドを何度も呼び出す必要がある場合、一時オブジェクトがヒープメモリをいっぱいにする可能性があり、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オブジェクトを1つだけ作成する必要があります。 元のStringと同じ量のメモリを割り当てますが、新しい文字の場所を作成するために、基になる配列は次の文字を1桁シフトします。
StringBuilder の使用は遅くなる可能性がありますが、一時オブジェクトを初期化するというメモリの負担はありません。また、シンプルで読みやすいコードになります。
5. 結論
この記事では、JavaのStringオブジェクトに文字を追加するいくつかの方法に焦点を当てました。 文字配列を使用した実装が最高のパフォーマンスを提供し、substringメソッドを使用した実装がより読みやすいアプローチを提供することを確認しました。
ソリューションを実装するための推奨される方法は、 StringBuilderクラスを使用することです。これは、シンプルでバグが発生しにくく、優れた安定したパフォーマンスを提供するためです。
いつものように、上記のチュートリアルの完全なソースコードは、GitHubからで入手できます。