Java道|文字列を追加できるStringBufferの使い方

文字列は、読むだけでなく組み立てることもできる。
StringBufferを使えば、言葉を後ろへつなぎ足しながら、ひとつの文章を作れるようになる。

Javaで文字列を扱うとき、まずよく使うのは String クラスです。

String クラスを使うと、文字数を調べたり、指定位置の文字を取り出したり、文字列の中から文字を探したりできます。これまで学んできた length()、charAt()、indexOf()、toUpperCase()、toLowerCase() なども、String クラスの便利なメソッドでした。

ただし、String には大切な特徴があります。

それは、一度作った文字列の中身を直接変更できないという点です。

たとえば、ある文字列の後ろに別の文字列を追加したいときや、途中に文字を差し込みたいとき、一部を別の文字に置き換えたいときがあります。こうした「あとから文字列を編集したい」場面では、String だけだと少し扱いにくく感じることがあります。

そこで役立つのが、StringBuffer クラスです。

StringBuffer は、作ったあとで中身を変えながら扱える文字列用のクラスです。文字列の後ろに追加したり、途中に差し込んだり、一部を置き換えたり、削除したりできます。

鬼滅の刃でたとえると、String は「完成済みの任務巻物」です。一度書かれた内容を直接書き換えるというより、必要なら新しい写しを作るイメージです。
一方、StringBuffer は「追記できる任務巻物」です。任務の途中で、新しい情報を後ろに書き足したり、必要に応じて内容を編集したりできます。

この違いを理解すると、文字列をただ表示するだけでなく、少しずつ組み立てていく処理が書きやすくなります。

StringクラスとStringBufferクラスの違い

まずは、String と StringBuffer の違いを整理しましょう。

どちらも文字列を扱うためのクラスですが、性質が違います。

クラス名特徴向いている場面鬼滅の刃でたとえると
String作成した文字列の内容を直接変更できない文字列をそのまま扱うとき完成済みの任務巻物
StringBuffer作成したあとで内容を変更できる追加、挿入、置換、削除をしたいとき追記・編集できる任務巻物

String は、固定された文字列を扱うのが得意です。

たとえば、隊士の名前、合言葉、表示メッセージのように、すでに決まっている文字列を扱うときに便利です。

一方で、StringBuffer は、あとから文字を追加したり、内容を変えたりしながら文字列を作りたいときに便利です。

たとえば、最初に「任務」と書いておき、あとから「開始」「完了」「報告済み」などを順番に追加していくような場面です。

鬼滅の刃でたとえると、String は清書された巻物です。
StringBuffer は、任務の進行に合わせて追記できる作戦記録帳です。

なぜStringBufferが必要なのか

文字列を扱うプログラムでは、あとから内容を変えたい場面がよくあります。

たとえば、次のような処理です。

やりたいことStringBufferで使いやすい理由
後ろに文字列を追加したいおはよう に ございます を追加するappend() で末尾に追加できる
途中に文字を入れたい東京駅 に 前 を入れて 東京駅前 にするinsert() で指定位置に入れられる
一部を別の文字列に変えたい2025年 を 2026年 にするreplace() で範囲を置き換えられる
文字を削除したい余分な記号を取り除くdeleteCharAt() などで削除できる
順番を逆にしたいabc を cba にするreverse() で反転できる

String でも文字列の連結はできます。
ただ、文字列を何度も追加したり、途中を編集したりする処理では、StringBuffer を使うと「中身を編集している」という意図が分かりやすくなります。

鬼滅の刃でたとえると、任務の巻物に情報がどんどん追加されていく場面です。

最初は「藤の森」とだけ書かれていた巻物に、あとから「へ向かう」「夜明け前に集合」「合図を確認」と追記していくような流れです。

このように、文字列を少しずつ組み立てたり、あとから直したりしたいときに、StringBuffer が役立ちます。

StringBufferオブジェクトを作る

StringBuffer を使うには、まず StringBuffer オブジェクトを作ります。

基本の形は次のようになります。

StringBuffer sb = new StringBuffer("こんにちは");

このコードでは、こんにちは という文字列をもとにして、StringBuffer 型のオブジェクト sb を作っています。

部分意味
StringBuffer文字列を編集できるクラス
sb作成した StringBuffer オブジェクトを扱う変数
new StringBuffer("こんにちは")こんにちは を初期内容として持つ StringBuffer を作る

String では、次のように文字列リテラルで簡単に作ることが多かったです。

String str = "こんにちは";

一方、StringBuffer はオブジェクトとして作るため、new StringBuffer(...) の形を使います。

鬼滅の刃でたとえると、StringBuffer sb = new StringBuffer("こんにちは"); は、こんにちは と最初に書かれた追記可能な巻物を1つ用意するようなものです。

この sb に対して、あとから append() などのメソッドを使って文字列を追加していきます。

append()メソッドで文字列を追加する

StringBuffer で最初に覚えたいメソッドが append() です。

append() は、現在の文字列の末尾に、新しい文字や文字列を追加するメソッドです。

基本の形は次のようになります。

sb.append("追加したい文字列");

たとえば、sb の中身が おはよう のときに、ございます を追加すると、結果は おはようございます になります。

元の内容追加する内容append() 後の内容
おはようございますおはようございます
今日もがんばろう今日もがんばろう
の風春の風
Java学習中Java学習中

append() は「末尾に追加する」と覚えると分かりやすいです。

鬼滅の刃でたとえると、巻物の最後に新しい任務文を追記する技です。
すでに書かれている内容の後ろに、次の言葉を自然につなぎ足します。

StringBuffer と append() の動きを確認する

実際のプログラムで、StringBuffer と append() の動きを確認してみましょう。

ファイル名:Sample4.java

import java.io.*;

class Sample4
{
    public static void main(String[] args) throws IOException
    {
        // キーボード入力の準備をする
        BufferedReader br =
            new BufferedReader(new InputStreamReader(System.in));

        // 元になる文字列を入力してもらう
        System.out.println("最初の任務文を入力してください。");
        String str1 = br.readLine();

        // 追加する文字列を入力してもらう
        System.out.println("続けて追加する任務文を入力してください。");
        String str2 = br.readLine();

        // StringBufferオブジェクトを作成する
        StringBuffer sb = new StringBuffer(str1);

        // 文字列を追加する
        sb.append(str2);

        // 結果を表示する
        System.out.println("つなげた結果は「" + sb + "」です。");
    }
}

このプログラムでは、まず最初の文字列を入力します。
そのあとで、追加したい文字列を入力します。

そして、StringBuffer を作り、append() を使って2つ目の文字列を後ろにつなげています。

たとえば、次のように入力したとします。

最初の任務文を入力してください。
おはよう
続けて追加する任務文を入力してください。
ございます

表示結果は次のようになります。

つなげた結果は「おはようございます」です。

鬼滅の刃でたとえると、最初の巻物に おはよう と書き、その後ろへ ございます を追記して、ひとつの文として完成させている流れです。

プログラムの流れを順番に見る

Sample4.java の処理を順番に整理すると、次のようになります。

順番処理説明
1BufferedReader を用意するキーボード入力の準備をする
2str1 に文字列を入力する元になる任務文を受け取る
3str2 に文字列を入力する追加する任務文を受け取る
4new StringBuffer(str1)str1 をもとに StringBuffer を作る
5sb.append(str2)sb の末尾に str2 を追加する
6結果を表示する追加後の内容を確認する

ここで大切なのは、append() が sb の内容を変化させているという点です。

StringBuffer sb = new StringBuffer(str1);
sb.append(str2);

最初に sb は str1 の内容を持っています。
そのあと、append(str2) によって、sb の後ろに str2 が追加されます。

タイミングsb の内容
new StringBuffer(str1) の直後str1 の内容
sb.append(str2) の後str1 + str2 の内容

鬼滅の刃でたとえると、最初の任務巻物を作り、その巻物の末尾へ追加の任務文を書き足しているイメージです。

append()は同じStringBufferの内容を変えていく

append() のポイントは、StringBuffer オブジェクトの中身を変えていくところです。

String のメソッドでは、変換結果として新しい String が返されるという考え方がよく出てきました。

たとえば、toUpperCase() は元の文字列を直接変えるのではなく、新しい文字列を返しました。

一方、StringBuffer の append() は、sb の中に文字列を追加して、sb 自体の内容を変化させます。

クラス代表的な動きイメージ
String新しい文字列を返すことが多い元の巻物を直接変えず、写しを作る
StringBuffer同じオブジェクトの内容を変えられる追記できる巻物に書き足す

たとえば、次のように続けて append() を呼ぶこともできます。

StringBuffer sb = new StringBuffer("全集中");
sb.append("の");
sb.append("呼吸");

この場合、最終的な内容は 全集中の呼吸 になります。

処理sb の内容
new StringBuffer("全集中")全集中
sb.append("の")全集中の
sb.append("呼吸")全集中の呼吸

鬼滅の刃でたとえると、巻物に 全集中 と書き、後ろに の、さらに 呼吸 と追記して、ひとつの言葉を完成させるようなものです。

Stringは変更できない、StringBufferは変更できる

ここは特に大切なところです。

String と StringBuffer は、どちらも文字列に関係するクラスですが、文字列の扱い方が違います。

観点StringStringBuffer
作成後の内容変更直接変更できない変更できる
得意な処理固定された文字列の扱い追加・編集しながら文字列を作る
代表的な使い方メッセージ、名前、固定文文章の組み立て、編集処理
鬼滅の刃でたとえると完成済みの巻物追記できる巻物

String は、作ったあとに中身そのものを直接変えるものではありません。
文字列を変換したいときは、新しい文字列を受け取る形になります。

StringBuffer は、同じオブジェクトの中身を変えていけます。
そのため、文字列を少しずつ追加したり、編集したりする処理に向いています。

鬼滅の刃でたとえると、String は完成した報告書です。
StringBuffer は任務中に追記していく作戦記録帳です。

どちらが優れているというより、使いどころが違います。

図:append()で文字列を後ろへ追加する

↓クリックすると拡大表示されます。

この図が示していること

この図では、StringBuffer の append() によって、元の文字列 おはよう の後ろに ございます が追加される流れを表しています。

左側の巻物には、最初に おはよう と書かれています。
中央の sb.append("ございます") によって、文字列の末尾に ございます が追加されます。
右側では、結果として おはようございます という1つの文字列になっています。

ここから分かるのは、append() は文字列の途中ではなく、末尾に内容を追加するメソッドだということです。
また、StringBuffer は追記できる巻物のように、同じオブジェクトの内容を変えながら文字列を組み立てられることも分かります。

StringBufferクラスの主なメソッド

StringBuffer には、append() 以外にも、文字列編集に便利なメソッドが用意されています。

メソッド機能鬼滅の刃でたとえると
append(char c)文字を追加する巻物の末尾に1文字を追記する
append(String str)文字列を追加する巻物の末尾に文を追記する
deleteCharAt(int index)指定位置の文字を削除する指定札の文字を消す
insert(int offset, char c)指定位置に文字を追加する巻物の途中に1文字を差し込む
insert(int offset, String str)指定位置に文字列を追加する巻物の途中に文を差し込む
length()文字数を返す巻物の文字数を数える
replace(int start, int end, String str)一部を別の文字列に置き換える指定範囲を書き換える
reverse()文字列を逆順にする巻物の文字順を逆にする
setCharAt(int index, char ch)指定位置の文字を変更する指定札の文字だけ差し替える
toString()String 型に変換する編集巻物を清書した文字列にする

この表を見ると、StringBuffer が文字列編集の道具箱のようなクラスだと分かります。

append() はその中でも、最初に覚えやすく、よく使う基本メソッドです。

append()以外の活用イメージ

StringBuffer は、append() だけのクラスではありません。

文字列を編集したい場面に合わせて、さまざまなメソッドを使えます。

やりたいこと使うメソッド
末尾に追加したいappend()任務 に 開始 を追加
途中に差し込みたいinsert()東京駅 に 前 を追加して 東京駅前
一部を書き換えたいreplace()2025年 を 2026年 に変更
1文字だけ変えたいsetCharAt()A-100 の A を B に変更
1文字削除したいdeleteCharAt()余分な記号を削除
逆順にしたいreverse()abc を cba にする

鬼滅の刃でたとえると、StringBuffer は任務巻物の編集道具です。

後ろに追記する。
途中に差し込む。
不要な文字を消す。
一部を書き換える。
順序を逆にする。

こうした編集作業を、ひとつのクラスで扱えるようになります。

toString()が必要になる場面

StringBuffer で編集した内容を、最後に String 型として扱いたいことがあります。

そのようなときに使うのが toString() です。

String result = sb.toString();

このコードでは、StringBuffer の中身を String 型の文字列として取り出し、result に入れています。

画面表示では、次のように sb をそのまま使っても、内容が文字列として表示されます。

System.out.println("つなげた結果は「" + sb + "」です。");

ただし、String 型の変数に入れたいときや、String を受け取るメソッドに渡したいときは、toString() を使うと分かりやすいです。

やりたいこと書き方
画面に表示するSystem.out.println(sb);
String 型として受け取るString result = sb.toString();
編集結果を別の処理に渡すsb.toString() を使う

鬼滅の刃でたとえると、StringBuffer は追記・編集できる作戦記録帳です。
toString() は、その編集済みの記録帳を、完成した清書の巻物として取り出すようなものです。

図:StringBufferは編集してからStringにできる

↓クリックすると拡大表示されます。

この図が示していること

この図では、StringBuffer を使って文字列を編集し、最後に toString() で String 型として取り出す流れを表しています。

最初に new StringBuffer("全集中") で、編集できる文字列を用意します。
そこに append("の")、append("呼吸") を使って、全集中の呼吸 という文字列を組み立てます。

そのあと、sb.toString() を使うことで、編集済みの内容を String 型として取り出せます。

ここから分かるのは、文字列を編集しながら作る段階では StringBuffer が便利で、完成した文字列として扱いたい段階では toString() を使うとよいということです。

実務や学習でどう役立つのか

StringBuffer は、文字列を少しずつ組み立てたいときに役立ちます。

場面活用例
メッセージを順番に組み立てるあいさつ文や通知文を少しずつ作る
入力結果をつなげる名前と敬称を結合する
編集しながら文字列を作る一部を変えつつ文章を整える
複数の文字列をまとめる順番に追加して1つの結果にする
レポート文を作る複数行の内容をつなげる

鬼滅の刃でたとえると、任務の進行に合わせて報告書を追記していくような場面です。

最初に任務名を書きます。
次に集合場所を追加します。
さらに合図や注意事項を書き足します。
最後に完成した報告文として取り出します。

このように、文字列を一度に完成させるのではなく、順番に作っていく処理で StringBuffer は便利です。

StringBufferを使うときの注意点

StringBuffer を使うときは、次の点を意識しておくと分かりやすいです。

注意点内容
String とは別のクラス同じ文字列系でも性質が違う
new StringBuffer(...) で作る最初にオブジェクトを作る
append() は末尾に追加する途中ではなく後ろにつく
中身を変更できる同じオブジェクトの内容を編集できる
必要なら toString() を使うString 型として扱いたいときに使う

特に大切なのは、String と StringBuffer を混同しないことです。

String は、固定された文字列を扱う基本クラスです。
StringBuffer は、編集しながら文字列を作るためのクラスです。

また、append() は「後ろに追加する」メソッドです。
途中に入れたい場合は insert() を使います。

やりたいこと使うメソッド
後ろに追加append()
途中に追加insert()
一部を置き換えるreplace()
文字を削除するdeleteCharAt()
String 型にするtoString()

鬼滅の刃でたとえると、append() は巻物の最後に書き足す技です。
途中へ差し込みたい場合は、別の技である insert() を使う、というイメージです。

StringBufferを理解すると文字列処理が広がる

StringBuffer を理解すると、文字列は「ただ表示するもの」ではなく、「あとから組み立てたり編集したりできるもの」として見えてきます。

String で文字列を調べる。
StringBuffer で文字列を追加・編集する。
必要に応じて toString() で String に戻す。

この流れが分かると、文字列処理の幅が広がります。

学んだ内容できるようになること
String文字列を調べる、比較する、検索する
StringBuffer文字列を追加する、編集する、組み立てる
append()末尾に文字列をつなげる
toString()編集後の内容を String として扱う

鬼滅の刃でたとえると、String は完成した巻物を読む技です。
StringBuffer は巻物を作りながら追記していく技です。

文字列を調べる力に、文字列を組み立てる力が加わると、Javaで表現できる処理はぐっと広がります。

append() は、その入口になるとても分かりやすいメソッドです。
まずは「StringBuffer は編集できる文字列」「append() は末尾に追加する」と押さえておくと、この先の insert()、replace()、deleteCharAt() などの理解にもつながります。