1. "ab" を 3 回繰り返すと "ababab" になる
  2. "x" を 5 回繰り返すと "xxxxx" になる
  3. n が 0 のときは空文字を返す
  4. s が空文字のときは n に関わらず空文字を返す
  5. "Java" を 2 回繰り返すと "JavaJava" になる
  6. 1 回だけの繰り返しは元の文字列と同じになる
コース一覧
Java 中級:コレクション・Stream・例外処理
StringBuilder で連結

Java 中級:コレクション・Stream・例外処理

コレクション、ジェネリクス、例外処理、Stream API、関数型インターフェース、日付処理、ファイル I/O、継承など Java の中級トピックを実践的に学べるコースです。Java の基礎文法とオブジェクト指向を理解している学習者を対象に、現場の Java コードを読み書きするための知識を補強します。約 16 時間 (1 日 30 分 × 32 日) で 64 レッスンを修了でき、修了後は Spring Boot や業務システム開発に必要な Java 力が身につきます。

1
コレクション基礎
01. ArrayList を使う5分
02. List を走査する5分
03. 要素の削除と検索5分
04. HashMap の基本5分
05. Map を走査する5分
06. Set で重複を排除5分
07. Collections クラスの便利メソッド5分
08. コレクション基礎 まとめクイズ5分
2
ジェネリクス
01. ジェネリッククラスを作る5分
02. ジェネリックメソッド5分
03. 境界型パラメータ5分
04. ワイルドカード ?5分
05. Pair<K,V> を作る5分
06. ジェネリクス まとめクイズ5分
3
例外処理
01. try-catch で例外をつかむ5分
02. 複数の catch ブロック5分
03. throws と例外の伝播5分
04. 独自の例外を作る5分
05. try-with-resources5分
06. finally ブロック5分
07. 例外処理 まとめクイズ5分
4
Stream API
01. Stream を作る5分
02. filter で絞り込む5分
03. map で変換する5分
04. reduce で集約する5分
05. collect で集める5分
06. sorted で並び替え5分
07. distinct で重複排除5分
08. limit と skip5分
09. 並列ストリーム5分
10. Stream API まとめクイズ5分
5
関数型インターフェース
01. ラムダ式の基本5分
02. メソッド参照 ::5分
03. Function インターフェース5分
04. Predicate インターフェース5分
05. Consumer と Supplier5分
06. BiFunction と 2 引数の関数5分
07. 関数型インターフェース まとめクイズ5分
6
文字列操作
01. String.format で書式化5分
02. StringBuilder で連結5分
03. 正規表現の基本5分
04. split と join5分
05. 文字列操作 まとめクイズ5分
7
日付と時刻
01. LocalDate で日付を扱う5分
02. LocalDateTime で時刻も扱う5分
03. Duration で時間差を計算5分
04. 日付の書式化とパース5分
05. 日付の加減算5分
06. 日付と時刻 まとめクイズ5分
8
ファイル I/O
01. Files でファイルに書き込む5分
02. ファイルを行単位で読む5分
03. Path でファイルパスを扱う5分
04. BufferedReader と Stream API5分
05. ファイルの存在確認と削除5分
06. ファイル I/O まとめクイズ5分
9
継承とポリモーフィズム
01. extends で継承する5分
02. super で親を呼ぶ5分
03. メソッドのオーバーライド5分
04. abstract で抽象クラス5分
05. interface で契約を定義5分
06. default メソッド5分
07. instanceof と型パターン5分
08. ポリモーフィズムを活かす5分
09. 継承とポリモーフィズム まとめクイズ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 すること

入出力例

repeat("ab", 3) → "ababab" repeat("x", 5) → "xxxxx" repeat("hi", 0) → "" repeat("", 5) → "" repeat("Java", 2) → "JavaJava" repeat("hello", 1) → "hello"

ヒント

`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 で保存