「こんにちは、アミーゴ!」

「こんにちは、リシ!」

「これで、文字列について十分に理解できたので、興味深いことを学ぶことができます。具体的には、String クラスに似ていますが、まったく同じではない新しいクラスです。」

「興味深いことに思えますが、通常の文字列ではどのように不十分なのか、なぜ他の文字列に似たクラスが必要なのかは完全にはわかりません。」

「Java では文字列が不変オブジェクトであるという事実から始めましょう。」

「どうしたの?忘れてた…というか、最初から知らなかった…」

「不変オブジェクトとは、作成後に状態を変更できないオブジェクトであることを思い出してください。」

「ああ...なぜ Java では文字列が不変なのでしょうか?」

「これは、String クラスを高度に最適化し、どこでも使用できるようにするために行われました。たとえば、HashMap コレクションのキーとして使用する場合は、不変型のみが推奨されます

「しかし、プログラマが String クラスが可変である方が便利だと考える状況がよく起こります。プログラマは、メソッドが呼び出されるたびに新しい部分文字列を作成しないクラスを望んでいます。」

「でも、それが何の役に立つの?」

「非常に大きな文字列があり、その末尾に頻繁に何かを追加する必要があるとします。この場合、文字のコレクション ( ArrayList<Character>) であっても、String オブジェクトを常に再作成して連結するよりも効率的です。」

「それが、String クラスではない文字列が必要な理由ですか?」

「そのとおりです。Java 言語には、変更可能な String のような型が追加されました。それは、StringBuilder」と呼ばれます。

オブジェクトの作成

StringBuilder既存の文字列に基づいてオブジェクトを作成するには、次のようなステートメントを実行する必要があります。

StringBuilder name = new StringBuilder(string);

「空の可変文字列を作成するには、次のようなステートメントを使用する必要があります。

StringBuilder name = new StringBuilder();

メソッドのリスト

「このStringBuilderクラスには 24 個の便利なメソッドがあります。最も重要なものを以下に示します。

方法 説明
StringBuilder append(obj)
渡されたオブジェクトを文字列に変換し、現在の文字列に追加します。
StringBuilder insert(int index, obj)
渡されたオブジェクトを文字列に変換し、現在の文字列の途中に挿入します。
StringBuilder replace(int start, int end, String str)
start..end 間隔で指定された文字列の部分を、渡された文字列に置き換えます。
StringBuilder deleteCharAt(int index)
指定されたインデックスを持つ文字を文字列から削除します
StringBuilder delete(int start, int end)
指定された間隔内の文字を文字列から削除します
int indexOf(String str, int index)
現在の文字列内の部分文字列を検索します
int lastIndexOf(String str, int index)
現在の文字列内の部分文字列を末尾から検索します。
char charAt(int index)
渡されたインデックスにある文字列内の文字を返します。
String substring(int start, int end)
指定された間隔で定義された部分文字列を返します。
StringBuilder reverse()
現在の文字列を反転します。
void setCharAt(int index, char)
指定されたインデックスの文字を渡された文字に変更します
int length()
文字列の長さを文字数で返します。

「それでは、これらの各方法について簡単に説明します。

文字列に追加する

「可変文字列 ( StringBuilder) に何かを追加するには、append()メソッドを使用します。例:

コード 説明
StringBuilder builder = new StringBuilder("Hi");
builder.append("Bye");
builder.append(123);
Hi
HiBye
HiBye123

標準文字列への変換

StringBuilderオブジェクトを String オブジェクトに変換するには、そのメソッドを呼び出すだけですtoString()。例

コード 出力
StringBuilder builder = new StringBuilder("Hi");
builder.append(123);
String result = builder.toString();
System.out.println(result);
Hi123

キャラクターを削除するにはどうすればよいですか?

「可変文字列内の文字を削除するには、deleteCharAt()メソッドを使用する必要があります。例:

コード 出力
StringBuilder builder = new StringBuilder("Hello");
builder.deleteCharAt(2);
String result = builder.toString();
System.out.println(result);
Helo

文字列の一部を別の文字列に置き換えるにはどうすればよいですか?

「これには方法がありますreplace(int begin, int end, String str)。例:

コード 出力
StringBuilder builder = new StringBuilder("Mellow");
builder.replace(2, 5, "Hello!");
String result = builder.toString();
System.out.println(result);
MeHello!w

「便利ですね。ありがとう、リシ」

「それは言わないでください。これはどうですか。文字列を逆にひっくり返すことができますか?どうしますか?」

「そうですね... を作成しStringBuilder、その中に文字列を入れます... 次に、新しい文字列を作成し、最後の文字から最初の文字までループします... あるいは、ビットごとのシフト...

「悪くありません。しかし、もっと速い可能性があります。これを行うための特別な方法があります。reverse();例:

コード 出力
String str = "Hello";
StringBuilder builder = new StringBuilder(str);
builder.reverse();
String result = builder.toString();
System.out.println(result);
olleH

StringBuilderクラスのほかに、Java には と呼ばれる別の文字列のようなクラスがありますStringBuffer。これはクラスの類似物ですStringBuilderが、そのメソッドはsynchronized修飾子でマークされています。」

"どういう意味ですか?"

「これは、StringBufferオブジェクトに複数のスレッドから同時にアクセスできることを意味します。」

「私はまだスレッドについてあまり詳しくありません。しかし、『複数のスレッドからアクセスできない』よりも『複数のスレッドからアクセスできる』の方が明らかに優れています。それなら、なぜ常に使用しないのでしょうか? StringBuffer

「これは よりもはるかに遅いためです。Javaマルチスレッド化StringBuilderクエストでマルチスレッド化を積極的に検討し始めると、このようなクラスが必要になる場合があります。

「忘れないようにメモしておきます。『未来のために』と書きました。」