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です。コンストラクタで指定できます。
📖 まとめ
- StringBuilderは可変の文字シーケンスで、頻繁な変更に最適
- 一般的なメソッド:append/insert/delete/replace/reverse
- メソッドチェーンをサポート
- 単一スレッドにはStringBuilder、マルチスレッドにはStringBuffer
- デフォルト容量は16、超えると自動的に成長
📝 演習
- 文字列連結: StringBuilderを使用して1から100の数値をカンマ区切りで連結
- HTML構築: StringBuilderを使用して順序なしリスト(ul/li)を構築
- パフォーマンステスト: StringとStringBuilderの10,000回連結の時間を比較
次のレッスン
次のレッスンでは、数学と日付を学びます — Mathクラスと日付/時刻API。



