コース一覧
    Java中級:文字列・日付・標準ライブラリ
    StringBuilder で連結

    Java中級:文字列・日付・標準ライブラリ

    文字列・日付・時刻と標準ライブラリを学び、よく使うデータ加工や日時処理を適切に実装できるようにします。

    1
    文字列操作
    01. String.format で書式化5分
    02. StringBuilder で連結5分
    03. 正規表現の基本5分
    04. split と join5分
    05. 文字列操作 まとめクイズ5分
    2
    日付と時刻
    01. LocalDate で日付を扱う5分
    02. LocalDateTime で時刻も扱う5分
    03. Duration で時間差を計算5分
    04. 日付の書式化とパース5分
    05. 日付の加減算5分
    06. 日付と時刻 まとめクイズ5分

    StringBuilder で連結

    1 万件つないだところで、急に遅くなる

    ログの行やレポートの本文を組み立てる処理は、書いているうちは何ということもありません。ところがデータが 100 件から 10 万件に増えたとたん、同じコードが数秒から数十秒かかるようになります。

    原因はほぼ 1 つで、ループの中で + を使って文字列をつないでいることです。

    Java

    String result = "";
    for (String name : names) {
        result = result + name + ",";
    }

    見た目は素直ですが、これは要素数が増えると二次関数的に遅くなります。

    + は毎回、まるごと新しい文字列を作り直している

    Java の String は、一度作ったら中身を書き換えられません。s.toUpperCase() を呼んでも s 自身が大文字になるのではなく、大文字版の別オブジェクトが返ってくるだけです。この性質をイミュータブルと言います。

    つまり result = result + name は、result の末尾に文字を書き足しているのではありません。それまでの result を全部コピーし、name をつなげた新しい String を作り、その新しい方を result に指し直しています。

    1 万回まわせば、1 万個の使い捨て文字列ができます。しかも 1 回あたりのコピー量は回を追うごとに増えるので、合計は 5000 万文字規模になります。遅いのは当たり前で、その分だけ回収の負担も増えます。

    中身を書き換えられる箱を、1 つだけ用意する

    StringBuilder は、伸びる配列を内側に持った書き換え可能な文字列です。append を呼ぶと、新しいオブジェクトを作らずにその配列の末尾へ書き足します。java.lang にあるので import は要りません。

    Java

    public class Demo {
        public static void main(String[] args) {
            StringBuilder sb = new StringBuilder();
            sb.append("id=").append(42);
            sb.append(" name=").append("java");
    
            String line = sb.toString();
            System.out.println(line);   // id=42 name=java
        }
    }

    append は自分自身を返すので、上のように点でつないで書けます。ループの中で何度 append を呼んでも、箱は最初に作った 1 つのままです。増えるのは中の配列の中身だけなので、件数に比例した時間で終わります。

    最後の toString() を忘れないでください。

    Java

    String ng = sb;              // コンパイルエラー
    String ok = sb.toString();   // これで String になる

    sb は文字列を組み立てるための道具で、String そのものではありません。System.out.println(sb) のように内部で toString が呼ばれる場面だけは例外です。

    解説

    よく似た StringBuffer は、複数のスレッドから同時に触られても壊れない代わりに少し遅い版です。1 つのメソッドの中で組み立てて捨てる普通の使い方なら StringBuilder を選びます。

    なお、first + " " + last のような 2 回か 3 回きりの連結は、コンパイラが自動で同じ仕組みに置き換えてくれます。StringBuilder を持ち出すべきなのは、あくまでループの中で繰り返しつなぐときです。

    要件

    1. StringBuilder を new StringBuilder() で生成して使うこと (+ 連結だけで実装しない)
    2. for などのループで s を n 回 append すること
    3. 最後に toString() で String に変換してから return すること

    ヒント

    `new StringBuilder()` で空のバッファを作り、`sb.append(s)` を `n` 回呼べば組み立てられます

    `for (int i = 0; i < n; i++)` のループなら、`n` が `0` のときは一度も実行されないので、空文字 `""` が自然と返ります

    戻り値の型は `String` なので、`return sb;` ではなく `return sb.toString();` と書く必要があります

    生田 陸人
    監修生田 陸人
    ゆめさくエンジニア / 現役ソフトウェアエンジニア監修者プロフィールを見る →
    編集 ゆめさく編集部·公開 2026/05/19·更新 2026/08/26

    関連レッスン

    • 正規表現の基本

      Java の正規表現の基本パターンとメタ文字のエスケープを学び、String.matches を使って簡易なメール形式かを判定する関数を書いてみよう。

    • split と join

      Java の文字列を扱う上で必須の `String.split` と `String.join` を学び、CSV を逆順に並べ替えるメソッドを実装してみよう。

    • 文字列操作 まとめクイズ

      中級「文字列操作」章で学んだ `String.format` / `StringBuilder` / 正規表現 / `split` / `join` の使い分けを 4 択で総ざらいする章末まとめ。

    • LocalDate で日付を扱う

      Java 8 で導入された java.time.LocalDate を使って、日付の生成・加減算・整形を学び、年月日から ISO 形式の文字列を返すコードを書いてみよう。

    このレッスンに出てくる用語

    意味があいまいなまま進んだ語は、ここから読み直せます。

    • 処理計算や代入を表す長方形
    • ループ繰り返し処理。矢印で戻すか専用記号で示す
    • 素数1 と自分自身でしか割り切れない自然数
    • 関数処理に名前を付けて再利用できる単位
    • オブジェクトキーと値のペアで構造を作るデータ
    • イミュータブル既存データを書き換えず新しい値を作る方針
    • ミュータブルミュータブル=変更可能(リスト、辞書、セット)。
    • 配列サイズ固定の同型データの集まり
    main.java
    エディタを読み込んでいます

    メモ

    StringBuilder で連結

    ⌘S で保存