1.はじめに

このクイックチュートリアルでは、

Java

。の

String

の任意の位置に文字を追加する方法を説明します。

元の

String、

文字、およびそれを追加する必要がある位置をとる単純な関数の3つの実装を提示します。

Stringクラスはhttps://www.baeldung.com/java-string-immutable[final and immutable]なので、関数は追加された文字を含む新しい

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

を準備します。

  1. 位置の前の元の

    String

    のサブストリング

  2. 新しいキャラクター

  3. 位置の後の元の

    String

    の部分文字列

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

上記のコードは読みやすくなっていますが、** 結果を判断するために多数の一時オブジェクトを作成するという欠点があります。

最後に、パーツを連結すると、コンパイラはそれらを1つずつ追加するための

StringBuilder

オブジェクトを作成します。すべての

String

および

StringBuilder

オブジェクトは、その内部文字配列に別々のメモリー位置を割り当てます。

この実装では、ある配列から別の配列にすべての文字を3回コピーする必要もあります。

このメソッドを何度も呼び出す必要がある場合、一時オブジェクトがヒープメモリをいっぱいにする可能性があり、それがGCを頻繁にトリガします。これもパフォーマンスにある程度影響する可能性があります。

4.

StringBuilder

を使う


StringBuilder

は、

String

オブジェクトをさまざまな方法で構築および操作するために

Java

ライブラリによって提供されるユーティリティクラスです。


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

クラスを使用することです。これは、シンプルでバグが少なく、安定したパフォーマンスが得られるためです。

いつものように、上記のチュートリアルの完全なソースコードはhttps://github.com/eugenp/tutorials/tree/master/core-java[over on GitHub]にあります。