指定された位置で文字列に文字を追加します
1. 前書き
このクイックチュートリアルでは、demonstrate how to add a character at any given position in a String in Java.
元のString,の文字と、それを追加する必要のある位置を取得する単純な関数の3つの実装を示します。
Stringクラスはfinal and immutableであるため、関数は文字が追加された新しいStringを返す必要があります。
2. 文字Arrayの使用
ここでのアイデアは、新しい文字配列を作成し、指定された位置の前の元の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);
}
上記のコードは読みやすくなっていますが、it has a downside in that it creates a number of temporary objects to determine the result.Stringは不変のクラスであるため、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の使用は遅くなる可能性がありますが、一時オブジェクトを初期化するというメモリの負担はありません。 We also end up with code that is simple and readable.
5. 結論
この記事では、JavaのStringオブジェクトに文字を追加するいくつかの方法に焦点を当てました。 文字配列を使用した実装が最高のパフォーマンスを提供し、substringメソッドを使用した実装がより読みやすいアプローチを提供することを確認しました。
ソリューションを実装するための好ましい方法は、the StringBuilder class – as it’s simple, less bug-prone and offers good and stable performanceを使用することです。
いつものように、上記のチュートリアルの完全なソースコードはover on GitHubで入手できます。