🍀 【初心者向け】String と StringBuilder の違いをやさしく解説
Java の文字列操作では、
String と StringBuilder の違いがよく話題になります。
「なんとなく知ってるけど、本当の違いはよく分かってない…」
そんな声をよく聞くので、まずは超シンプルに整理します。
✔ 結論:
String は “変わらない文字列”
StringBuilder は “変えられる文字列”
🔸 String は immutable(不変)
一度作ったら 中身は二度と変わりません。
String s = "Hello";
s = s + "World"; // ← 実は新しい String を作っている
見た目は「くっつけているだけ」に見えますが、
内部では まったく別の String オブジェクト を再生成しています。
その結果:
- メモリの再確保が起こる
- ゴミオブジェクトが増える
- 連結が多いとパフォーマンスが悪い
🔸 StringBuilder は mutable(可変)
中身を書き換えられます。
StringBuilder sb = new StringBuilder("Hello");
sb.append("World"); // ← 既存の領域に追加している
こちらは 新しいオブジェクトを作らない ため高速です。
大量の文字列操作(ループ・ログ生成など)では圧倒的に有利。
✔ 使い分けの基本ルール
| 用途 | 使うべきもの |
|---|---|
| 文字列が変わらない | String |
| 大量に連結する | StringBuilder |
| スレッドセーフが必要 | StringBuffer(ほぼ使わない) |
🧠 ここまでのまとめ(初心者向け)
- String は変わらない
- StringBuilder は変えられる
- 大量連結は StringBuilder
- 普段の定数やメッセージは String でOK
ここまで理解できれば、Java の文字列操作で迷うことはほぼ無いです。
🔍 【後半:ニッチ・深掘り編】StringBuilder の内部構造とメモリ管理
ここからは「Deep Friendly Tech」らしく、
“少しだけ深く” 解説していきます。
「内部動作を理解できるエンジニアになりたい」
という方のためのセクションです。
🧩 StringBuilder の内部はどうなっている?
StringBuilder は内部で char[](文字配列) を使っています。
Java 17 以降は実際には byte[] + coder 方式ですが、概念は同じです。
✔ append すると何が起きる?
sb.append("ABC");
- 既存のバッファ(byte[])の 空き容量をチェック
- 空きがあればそこに追加
- 足りなければ内部で 配列を拡張(resize)
- 新しい配列を生成し、コピーしてから追加
→ 可変だけど、容量不足のときだけ再確保が発生する
🧮 バッファ拡張の計算式(ニッチだけど大事)
StringBuilder の拡張はだいたい下記のように行われます。
- ✔ 新しい容量 = 旧容量 × 2 + 2
(倍増戦略)
これは ArrayList と似た設計で、
「頻繁な拡張を避けて高速にする」ためです。
🚀 パフォーマンスの勘所(実務で効くポイント)
- 大量連結が予想できるなら 初期容量を指定するのが最強
// 1000文字くらい作ると分かってるなら最初から広めに取る
StringBuilder sb = new StringBuilder(1024);
- これにより、途中の配列拡張(=コスト)を減らせます
- 競技プログラミングやログ生成処理でも有効
🧵 スレッドセーフはどうなの?
- StringBuilder → 非スレッドセーフ(速い)
- StringBuffer → スレッドセーフ(遅い)
現代の Java では
「明示的に同期したいなら他の方法を使う」
という考えが主流なので、StringBuffer の登場はかなり減っています。
🏁 この記事のまとめ
- String は不変 → シンプルで安全
- StringBuilder は可変 → 高速で柔軟
- 内部では byte[] のバッファを持ち、必要に応じて拡張
- 大量連結では初期容量指定が最も効率的
- スレッド安全性なら StringBuffer や別手段を使う
✨ Deep Friendly Tech の一言
プログラミング学習で大事なのは
「動きの結果」ではなく
“なぜそう動くのか” を理解すること。
内部が分かると
- デバッグに強くなる
- パフォーマンス設計がうまくなる
- AI が書いたコードのレビューも正しくできる
あなたのエンジニアリングは
確実にレベルアップします。

コメント