StringBuilder

StringBuilderは可変の文字シーケンスで、頻繁な文字列変更が必要なシナリオに最適です。

StringBuilderが必要な理由

Stringは不変です—すべての変更が新しいオブジェクトを作成し、非効率的です。

例:String vs StringBuilder

JAVA
// 文字列連結(非効率的)
String s = "";
for (int i = 0; i < 10000; i++) {
    s += "a";  // 毎回新しいオブジェクトを作成
}

// StringBuilder連結(効率的)
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 10000; i++) {
    sb.append("a");  // 同じオブジェクトを変更
}
String result = sb.toString();
▶ 試してみよう
💡 パフォーマンスの違い: 10,000回のループ連結では、StringBuilderはStringの100倍以上高速です。

StringBuilderの作成

JAVA
// 空のStringBuilder
StringBuilder sb1 = new StringBuilder();

// 初期容量付き
StringBuilder sb2 = new StringBuilder(100);

// 初期内容付き
StringBuilder sb3 = new StringBuilder("Hello");

一般的なメソッド

append():末尾に追加

JAVA
StringBuilder sb = new StringBuilder();
sb.append("Hello");
sb.append(" ");
sb.append("World");
sb.append(123);
System.out.println(sb);  // HelloWorld123

insert():位置に挿入

JAVA
StringBuilder sb = new StringBuilder("Hello");
sb.insert(5, " World");
System.out.println(sb);  // Hello World

delete():文字を削除

JAVA
StringBuilder sb = new StringBuilder("Hello World");
sb.delete(5, 6);  // インデックス5の文字を削除(スペース)
System.out.println(sb);  // HelloWorld

replace():文字を置換

JAVA
StringBuilder sb = new StringBuilder("Hello World");
sb.replace(6, 11, "Java");
System.out.println(sb);  // Hello Java

reverse():文字列を反転

JAVA
StringBuilder sb = new StringBuilder("Hello");
sb.reverse();
System.out.println(sb);  // olleH

その他のメソッド

メソッド 説明
charAt() インデックスの文字を取得 sb.charAt(0)
length() 現在の長さ sb.length()
capacity() 現在の容量 sb.capacity()
setCharAt() インデックスの文字を設定 sb.setCharAt(0,'h')
substring() 部分文字列を取得 sb.substring(0,3)

メソッドチェーン

StringBuilderのメソッドはthisを返すため、メソッドチェーンをサポートします。

JAVA
String result = new StringBuilder()
    .append("Hello")
    .append(" ")
    .append("World")
    .append("!")
    .toString();

System.out.println(result);  // Hello World!

例:SQL文の構築

JAVA
public class SqlBuilder {
    public static String buildSelect(String table, String[] columns, String where) {
        StringBuilder sql = new StringBuilder("SELECT ");
        
        // カラム名
        sql.append(String.join(", ", columns));
        sql.append(" FROM ");
        sql.append(table);
        
        // 条件
        if (where != null && !where.isEmpty()) {
            sql.append(" WHERE ");
            sql.append(where);
        }
        
        return sql.toString();
    }
    
    public static void main(String[] args) {
        String sql = buildSelect("users", 
            new String[]{"id", "name", "email"}, 
            "age > 18");
        System.out.println(sql);
        // SELECT id, name, email FROM users WHERE age > 18
    }
}

例:HTMLの構築

JAVA
public class HtmlBuilder {
    public static String buildTable(String[][] data) {
        StringBuilder html = new StringBuilder();
        html.append("<table>\n");
        
        for (String[] row : data) {
            html.append("  <tr>\n");
            for (String cell : row) {
                html.append("    <td>").append(cell).append("</td>\n");
            }
            html.append("  </tr>\n");
        }
        
        html.append("</table>");
        return html.toString();
    }
    
    public static void main(String[] args) {
        String[][] data = {
            {"Alice", "25", "Engineer"},
            {"Bob", "30", "Designer"}
        };
        System.out.println(buildTable(data));
    }
}

StringBuilder vs StringBuffer

特徴 StringBuilder StringBuffer
スレッドセーフ いいえ はい
パフォーマンス 高速 低速
使用ケース 単一スレッド マルチスレッド
💡 推奨: 単一スレッドコードにはStringBuilderを使用し、マルチスレッドコードにはStringBufferを使用します。一般的にはStringBuilderが推奨されます。

容量と成長

StringBuilderには容量の概念があり、超えると自動的に成長します。

JAVA
StringBuilder sb = new StringBuilder();
System.out.println("初期容量: " + sb.capacity());  // 16

// 内容を追加、容量を超えると成長
for (int i = 0; i < 20; i++) {
    sb.append("a");
}
System.out.println("現在の容量: " + sb.capacity());  // 34
System.out.println("現在の長さ: " + sb.length());    // 20
💡 成長ルール: 新しい容量 = 古い容量 * 2 + 2

❓ よくある質問

Q いつStringBuilderを使用すべきですか?
A ループ連結や複雑な文字列の構築など、文字列を頻繁に変更する必要がある場合に使用します。
Q StringBuilderとStringのどちらを選ぶべきですか?
A 少数の操作にはStringを使用し(より簡単)、多数の操作にはStringBuilderを使用します(より高速)。
Q StringBuilderのデフォルト容量はいくつですか?
A デフォルトは16です。コンストラクタで指定できます。

📖 まとめ

📝 演習

  1. 文字列連結: StringBuilderを使用して1から100の数値をカンマ区切りで連結
  2. HTML構築: StringBuilderを使用して順序なしリスト(ul/li)を構築
  3. パフォーマンステスト: StringとStringBuilderの10,000回連結の時間を比較

次のレッスン

次のレッスンでは、数学と日付を学びます — Mathクラスと日付/時刻API。

100%